framer
Goto Top

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

Content-ID: 321155

Url: https://administrator.de/contentid/321155

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

SaschaRD
SaschaRD 16.11.2016 um 11:28:37 Uhr
Goto Top
Hallo @FrAmEr,
select Spieltag, max(Tore_Heim) from Spiel; 
Gruß, Sascha
em-pie
em-pie 16.11.2016 aktualisiert um 11:40:36 Uhr
Goto Top
Moin,


Zitat von @SaschaRD:

Hallo @FrAmEr,
select Spieltag, max(Tore_Heim) from Spiel; 
Gruß, Sascha

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
FrAmEr
FrAmEr 16.11.2016 um 11:47:18 Uhr
Goto Top
Hallo em-pie,

Vielen Dank für deine Antwort.
Mein erster Ansatz war auch der von SaschaRD, jedoch wir zwar das MAX von Tore_Heim angezeigt allerdings nicht der passende Spieltag dazu, bei dem Tore_Heim maximal ist.

Deine Antwort überschreitet meinen Kenntnisstand. Ist es nicht "einfacher" möglich um den passenden Spieltag zu MAX(Tore_Heim) herauszufinden?

Gruß
Biber
Lösung Biber 16.11.2016 aktualisiert um 12:03:38 Uhr
Goto Top
Moin FrAmEr,

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.
em-pie
em-pie 16.11.2016 um 12:09:52 Uhr
Goto Top
kenne keinen anderen Weg...

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
Man hätte es auch so schreiben können:

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
FrAmEr
FrAmEr 16.11.2016 um 12:52:06 Uhr
Goto Top
Danke ja genau die Abfrage wollte ich.
Ja ich weiß es könnten auch mehrer sein aber in dem Fall war es nur einer.

Gruß FrAmEr
em-pie
em-pie 16.11.2016 aktualisiert um 13:05:43 Uhr
Goto Top
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
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
Biber
Biber 16.11.2016 um 13:17:02 Uhr
Goto Top
Moin em-pie,

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
em-pie
em-pie 16.11.2016 um 13:31:19 Uhr
Goto Top
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