![]() |
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! |
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... |
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. |
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 |
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); |
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 |
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. |
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 |
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! |
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? |
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag