![]() |
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? |
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 |
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?! |
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 |
So DB online unter:
http://www.unet.univie.ac.at/~a98045...ten_Gesamt.mdb Wer super wenn wer die Abfrage noch checkt |
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; |
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