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-Key: 321155

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

Printed on: April 27, 2024 at 15:04 o'clock

Member: SaschaRD
SaschaRD Nov 16, 2016 at 10:28:37 (UTC)
Goto Top
Hallo @FrAmEr,
select Spieltag, max(Tore_Heim) from Spiel; 
Gruß, Sascha
Member: em-pie
em-pie Nov 16, 2016 updated at 10:40:36 (UTC)
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
Member: FrAmEr
FrAmEr Nov 16, 2016 at 10:47:18 (UTC)
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ß
Member: Biber
Solution Biber Nov 16, 2016 updated at 11:03:38 (UTC)
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.
Member: em-pie
em-pie Nov 16, 2016 at 11:09:52 (UTC)
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
Member: FrAmEr
FrAmEr Nov 16, 2016 at 11:52:06 (UTC)
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
Member: em-pie
em-pie Nov 16, 2016 updated at 12:05:43 (UTC)
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
Member: Biber
Biber Nov 16, 2016 at 12:17:02 (UTC)
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
Member: em-pie
em-pie Nov 16, 2016 at 12:31:19 (UTC)
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