WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   sql abfrage (http://www.wcm.at/forum/showthread.php?t=151051)

EMB 22.11.2004 14:21

sql abfrage
 
hi!

habe 4 tabellen mit den attributen land und wert.

ich brauche eine sql abfrage die mir eine tabelle ausgibt, die jedes land der 4 tabellen vergleicht und nur den größten der 4 werte ausgiebt.

thanks!

T.dot 22.11.2004 14:30

Hä?

Ich freu mich ja immer über SQL Fragen, da ich mich da halbwegs auskenn, aber die Logik versteh ich jetz ned ganz ;)

also zuerst einmal, welche sql-sprache? mysql? mssql? access?

Du hast vier Tabellen in denen du jeweils die Felder "land" und "wert" hast? warum schreibst du das nicht einfach alles in eine tabelle? dann könntest (Access) einfach das machen:

SELECT Tabelle1.land
FROM Tabelle1
where Tabelle1.wert=(select max(Tabelle1.wert) From Tabelle1)

geht wahrscheinlich noch einfacher, mal schauen...

EMB 24.11.2004 10:54

Verwendet wird MS Access.

Ich habe eine Liste mit Ländern einem Wert und einem Namen.

Die Länder kommen öfter vor. Ich brauch nun zu jedem Land den Namen der den größten Wert hat.

Die SQL Abfrage von oben gibt mir nur das Land mit dem größten Wert aus.

T.dot 24.11.2004 11:38

aso!

SELECT Tabelle1.land, Max(Tabelle1.wert) AS Maxvonwert
FROM Tabelle1
GROUP BY Tabelle1.land;

statt Tabelle1 musst halt deinen Tabellennamen nehmen

wennst eh in Access arbeitest geht das auch sehr einfach, wenn du ne Auswahlabfrage in der Entwurfsansicht erstellst und dort "Funktionen" wählst (rechte Maustaste -> funktionen oder in der Titelleiste das Summensymbol)

mfg Thomas

EMB 25.11.2004 10:01

Ok. Wenn ich die letzte Abfrage versuche bekomme ich folgende Fehlermeldung:

Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Max Wert' nicht als Teil der Aggregatfunktion einschließt.

Müßte die Abfrage nicht ungefähr so aussehen?

select *
from tabelle
group by land
having max (wert);

EMB 25.11.2004 10:18

Einige Beispiel Datensätze. Mich interessiert vorerst nur die Kombination (für jedes Land das mit dem höchsten Wert in Min_Festnetz ausgeben plus den kartennamen).

ID Land Min_Festnetz Minutenpreis_Festnetz Min_Handy Minutenpreis_Handy Kartenname
47386097 Afghanistan 33,3 0,3 41,36 0,242 Trafik Handy
833 Afghanistan 22 0,435 Blackbox
1484 Afghanistan 22 0,435 Ideal tel univ
251 Afghanistan 28 0,3605 28 0,3626 Optima
1138 Afghanistan 30 0,329 Trafik Festnetz
252 Albania 66 0,1525 48 0,2076 Optima
47386099 Albania 17,4 0,575 20,46 0,489 Trafik Handy
834 Albania 74 0,135 64 0,1550 Blackbox
1485 Albania 74 0,135 64 0,1550 Ideal tel univ
1139 Albania 71 0,139 52 0,1890 Trafik Festnetz

EMB 25.11.2004 10:24

Diese Abfrage wurde mit dem Assistenten erstellt:

SELECT DISTINCTROW Gesamtliste.Land, Gesamtliste.Minutenpreis_Festnetz, Gesamtliste.Kartenname, Max(Gesamtliste.Min_Festnetz) AS [Max von Min_Festnetz]
FROM Gesamtliste
GROUP BY Gesamtliste.Land, Gesamtliste.Minutenpreis_Festnetz, Gesamtliste.Kartenname;

Im Prinzip funktioniert sie nur gibt sie mir alle Datensätze aus (zwar gereiht nach Land und da absteigend nach Min_Festnetz). Ich möchte aber nur das Land mit dem größten Wert in Min_Festnetz.

T.dot 25.11.2004 10:34

Also bei mir (mal auf Access 2003 getestet) funktioniert meine Abfrage ohne Probleme.

Für deine Feldnamen würds halt so aussehen:
SELECT Tabelle1.Land, Max(Tabelle1.Min_Festnetz) AS MaxvonMin_Festnetz
FROM Tabelle1
GROUP BY Tabelle1.Land;


das dies hier:
SELECT DISTINCTROW Gesamtliste.Land, Gesamtliste.Minutenpreis_Festnetz, Gesamtliste.Kartenname, Max(Gesamtliste.Min_Festnetz) AS [Max von Min_Festnetz]
FROM Gesamtliste
GROUP BY Gesamtliste.Land, Gesamtliste.Minutenpreis_Festnetz, Gesamtliste.Kartenname;

nicht funktioniert is auch klar. Wenn du alle Werte ausliest und nur das max vom festnetz, wie soll er die dann gruppieren? Access tut sich ein bisschen schwer verschieden Werte für Minutepreis_Festnetz, Kartenname, etc. zu gruppieren.

Also öffne deine Abfrage in der Entwurfsansicht und hau die Felder raus, die du nicht brauchst. Wenn du die Felder aber haben willst und die Werte in den Feldern, die zusammengefügt werden sollen nicht gleich sind, so musst du dir eine andere Gruppierfunktion (first, min, max, etc.) für das jeweilige feld suchen, das dir das gewünschte ergebnis liefert. Unter umständen brauchst du hierfür noch ne Unterabfrage dazu, müsste man sich überlegen.
Aber nachdem du nur Land und max Wert haben willst (wenn ich dich richtig verstanden habe), dann genügt es die Felder zu löschen.

Hoffe alle Möglichkeiten geklärt zu haben, mfg Thomas

EMB 25.11.2004 10:53

Ok. Du hast recht. Deine Abfrage funktioniert. Es wird zu jedem Land der größte Wert in Min_Festnetz ausgegeben.

Wie kann ich nun noch zusätzlich den Kartennamen ausgeben. (Funktioniert das nur mit einem natural join mit der ursprünglichen Tabelle).Wenn ich in der Entwurfsansicht noch ein Attribut (Kartennamen)auswähle, gibt Access mir wieder nicht nur den Datensatz mit dem größten Wert an.

Danke auf jeden Fall für deine Hilfe!

EMB 25.11.2004 12:19

SELECT Gesamtliste.Land, Gesamtliste.Min_Festnetz, Gesamtliste.Minutenpreis_Festnetz, Gesamtliste.Kartenname
FROM Gesamtliste
WHERE Gesamtliste.Min_Festnetz in (
SELECT Max(Gesamtliste.Min_Festnetz) AS MaxvonMin_Festnetz
FROM Gesamtliste
GROUP BY Gesamtliste.Land;);

Leider kommen wieder nicht die gewünschten daten raus. was läuft da falsch?

T.dot 25.11.2004 13:35

Hab grad deine Abfrage bei mir laufen lassen und bei mir bringt sie eigentlich das gewünschte ergebnis (für jedes land den maximalen wert und den dazugehörigen kartennamen).

Entweder hab ich zuwenig Daten oder ka - was passt bei dir nicht?

mfg Thomas

EMB 25.11.2004 13:43

Bei der letzten Abfrage mit select in werden zwar einzelne Datensätze ausgeschlossen, aber ich bekomm wieder nicht nur das land mit dem größten wert sondern mehrere tupel werden ausgegeben.

perfekt wäre deine abfrage:
SELECT Gesamtliste.Land, Max(Gesamtliste.Min_Festnetz) AS MaxvonMin_Festnetz
FROM Gesamtliste
GROUP BY Gesamtliste.Land;

nur mit mehr attributen im select statement. Nur so einfach geht es nicht denn da bekomm ich wieder:

Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Max Wert' nicht als Teil der Aggregatfunktion einschließt.

Hilfe?!

T.dot 25.11.2004 14:49

hm, hab jetz schö langsam auch keinen Plan mehr.

Vielleicht könntest deine Datenbank mit ein paar mehr Daten drin raufladen, dann tät ich mir leichter mitn Fehler verstehen. Weil eigentlich müsst deine vorige Abfrage funktionieren, auch wenns ka schönes SQL is (aber mir fallt momentan auch nix gscheiteres ein).

mfg

Bizeps 25.11.2004 16:48

So DB online unter:

http://www.unet.univie.ac.at/~a98045...ten_Gesamt.mdb

Wer super wenn wer die Abfrage noch checkt

Bizeps 25.11.2004 19:45

Ok DB nicht mehr online, da das Problem endlich gelöst wurde. Für alle die es interessiert ist hier die Lösung:

SELECT t.*
FROM [select Gesamtliste.Land, Max(Gesamtliste.Min_Festnetz) as maxMin_Festnetz from Gesamtliste group by Gesamtliste.Land]. AS d1, Gesamtliste AS t
WHERE t.Land=d1.Land And t.Min_Festnetz=d1.maxMin_FestNetz
ORDER BY t.Land, t.Min_Festnetz;

T.dot 26.11.2004 09:19

So ne ähnliche Abfrage hatte ich gestern Abend auch noch, wollt aber noch was gscheiteres finden, da mir solche Abfragen überhaupt ned zusagen.

Eigentlich müsste ein select max(...) und ein zugriff auf den rest über die ID reichen, aber in Access ist ja alles anders ;) Wenn ich Zeit hab schau ich mir das mal aus sqlserver/mysql an, einfach weils mich interessiert...

so far, viel Spaß noch mit der DB :D

mfg Thomas


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag