SQL-Abfrage mit MAX()
Hallo zusmamen,
ich komm leider bei einem Problem nicht weiter.
Angenommen wir haben eine SQL-Tablle die folgendermaßen aussieht:
Spiel (SpielID, Spieltag, Tore_Heim, Tore_Gast)
Nun möchte ich mit einer SELECT Abfrage den Spieltag und die Tore_Heim erhalten, bei dem Spiel bei dem Tore_Heim am größten ist.
Vielen Dank schonmal!
Gruß FrAmEr
ich komm leider bei einem Problem nicht weiter.
Angenommen wir haben eine SQL-Tablle die folgendermaßen aussieht:
Spiel (SpielID, Spieltag, Tore_Heim, Tore_Gast)
Nun möchte ich mit einer SELECT Abfrage den Spieltag und die Tore_Heim erhalten, bei dem Spiel bei dem Tore_Heim am größten ist.
Vielen Dank schonmal!
Gruß FrAmEr
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 321155
Url: https://administrator.de/contentid/321155
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo @FrAmEr,
Gruß, Sascha
select Spieltag, max(Tore_Heim) from Spiel;
Moin,
Fast..
du muss mit SUbselects arbeiten, daher müsste deine Select wie folgt aussehen:
Gruß
em-pie
Fast..
du muss mit SUbselects arbeiten, daher müsste deine Select wie folgt aussehen:
select a.* from SPIEL as a
inner join
(select Spieltag, max(tore_heim) as max_heim from SPIEL group by spieltag) as b on
a.spieltag = b.spieltag
and a.tore_heim = b.max_heim
Gruß
em-pie
Moin FrAmEr,
wie denn - noch einfacher??
Kürzer (aber vermutlich teurer) wäre nur noch eine Brachial-Abfrage
Grüße
Biber
P.S.
Wenn du nur einen, z.b den jüngsten willst, dann musst du noch ein TOP 1 und ein ORDER BY ergänzen.
wie denn - noch einfacher??
Kürzer (aber vermutlich teurer) wäre nur noch eine Brachial-Abfrage
select a.* from SPIEL as a
where a.tore_heim = (SELECT max(tore_heim) from SPIEL);
Grüße
Biber
P.S.
um den passenden Spieltag zu MAX(Tore_Heim) herauszufinden?
Nicht DEN passenden Spieltag - es können mehrere Spieltage sein, die diese Bedingung erfüllen.Wenn du nur einen, z.b den jüngsten willst, dann musst du noch ein TOP 1 und ein ORDER BY ergänzen.
kenne keinen anderen Weg...
Kurze hinweise:
Kurze hinweise:
- Was du und SaschaRD vergessen haben: eine Group by funktion. Ohne die funktionieren die Aggregatfunktionen wie MAX, SUM & Co. nicht
- Dann habe ich mit dem inneren Select zunächst nur die Daten anzeigen lassen, bei denen die Heimsiege an den jeweiligen Spieltagen am höchsten sind (es kann aber auch vorkommen, dass es 5 Spiele sind, da z.B. 5x 5:1 gespielt wurde)
- Nun galt es, die komprimierten Daten mit den gesamten Daten zu verknüpfen, um auch die SpielID ermittelt zu bekommen. Hierzu wurde ein INNER JOIN verwendet (google mal danach). Der gemeinsame Nenner ist hier: Spieltag und Tore_heim, da auf die Tore_heim ja eine Aggregatfunktion (MAX()) gelegt wurde.
- die Ergänzungen as a bzw as b erzeugt für die Tabelle und die groupierte "unbekannte" Tabelle einen Aliasnamen, sodass man diese dann gezielt ansprechen kann. Damit ich das MAX()-Feld auch im äußeren Select verwenden kann, habe ich noch ein as max_heim als Alias für die Spalte eingebunden
select
SPIEL.*
from
SPIEL
inner join
(select Spieltag, max(tore_heim) as max_heim from SPIEL group by spieltag) as b on
SPIEL.spieltag = b.spieltag
and SPIEL.tore_heim = b.max_heim
Dir ist aber bewusst, dass das Statement vom Bieber über z.B. 20 Spieltage, á 8 Spiele schaut, welches von den 160 Spielen den höchsten Heimsieg hat!?
Du ermittelst so nicht, welches der höchste Heimsieg am jeweiligen Spieltag gewesen ist.
Wenn ersteres deine Absicht gewesen ist:
Hier wird dir dann der erste Treffer angezeigt, welcher die höchsten Heimsiege hat
Soll noch ein weiteres Kriterim eingetragen werden, alá "UND Gast_Tore am geringsten", dann
Du ermittelst so nicht, welches der höchste Heimsieg am jeweiligen Spieltag gewesen ist.
Wenn ersteres deine Absicht gewesen ist:
Hier wird dir dann der erste Treffer angezeigt, welcher die höchsten Heimsiege hat
Select TOP 1 * from TEST order by tore_heim desc
Soll noch ein weiteres Kriterim eingetragen werden, alá "UND Gast_Tore am geringsten", dann
Select TOP 1 * from TEST order by tore_heim desc, tore_gast asc
Moin em-pie,
zumindest mir war es bewusst - und ich halte es aus zwei Gründen für suboptimal
Meine Abfrage - ohne jegliche Einschränkung und somit auch über alle Zeiten hinweg - wird nicht viel Aussagefähiges liefern.
Grüße
Biber
zumindest mir war es bewusst - und ich halte es aus zwei Gründen für suboptimal
- bei jedem deiner 160 Beispieldatensätze wird eine "SELECT MAX()"-Abfrage gemacht... das tat mir schon beim Tippen weh.
- es gäbe vielleicht zwei sinnvolle Fragestelungen, die gestellt werden könnten, nämlich "die meisten Heimtore je Spieltag" (siehe deine Lösung) und "die meisten Heimtore je Mannschaft" (wäre dieselbe Mimik mit einem Join mehr - irgendwo müssen ja die Mannschaften hinterlegt sein)
Meine Abfrage - ohne jegliche Einschränkung und somit auch über alle Zeiten hinweg - wird nicht viel Aussagefähiges liefern.
Grüße
Biber
Moin Biber,
wieder etwas gelernt... ich sollte öfter auch mal in die tieferen Details schauen, beim zusammenbauen von Statements -.- (Danke, für die Erleuchtung!)
Bin bisweilen davon ausgegangen, dass in meiner Konstellation einmal das Subselect erzeugt und dann damit gearbeitet wird....
Naja, was der TO exakt haben möchte müsste er uns verraten, sofern er mit dem Fred hier nicht schon "abgeschlossen" hat
Gruß
em-pie
wieder etwas gelernt... ich sollte öfter auch mal in die tieferen Details schauen, beim zusammenbauen von Statements -.- (Danke, für die Erleuchtung!)
Bin bisweilen davon ausgegangen, dass in meiner Konstellation einmal das Subselect erzeugt und dann damit gearbeitet wird....
Naja, was der TO exakt haben möchte müsste er uns verraten, sofern er mit dem Fred hier nicht schon "abgeschlossen" hat
Gruß
em-pie