DB2: Probleme mit Group by

sarte

Benutzer
Beiträge
5
Hey,
wieso spinnt Group by und Having bei DB2? In MySQL geht alles wunderbar...
Hier habe ich eine ganz einfache Abfrage und ich will die gruppieren nach der ID, aber das Land will ich mit haben:

Code:
SELECT Land, Max(AnzahlTore)as Gewinner, Spiel_id FROM (
                        SELECT Land, Sum(tore) as AnzahlTore, Spiel_id 
                        FROM SPIELER,SPIELT
                        WHERE Spieler.spieler_id = Spielt.Spieler_id
                        GROUP BY Land, Spiel_id
            )
        GROUP BY  Spiel_id
Aber wenn ich Land mit in die SELECT nehme, dann werde ich gezwungen Land auch zu gruppieren, aber das will ich ja nicht!
Eine andere Variante war von mir:
Code:
SELECT Land, AnzahlTore, Spiel_id FROM (
                        SELECT Land, Sum(tore) as AnzahlTore, Spiel_id 
                        FROM SPIELER,SPIELT
                        WHERE Spieler.spieler_id = Spielt.Spieler_id
                        GROUP BY Land, Spiel_id
            )
        GROUP BY  Spiel_id HAVING Max(AnzahlTore)
Aber bei Having verstehe ich nicht wieso er es nicht annimmt und mir sagt:
"END-OF-STATEMENT". Zu den möglichen Token gehören: "<interval_qualifier>".
SQLSTATE=42601
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
Hy.

@ Code 1: Dieses Verhalten ist normal. Soweit ich dank diesem Forum gelernt habe, erlaubt dies nur MySQL, dass nicht ALLE Spalten der Select-Klause, welche KEINE Agregatfunktionen sind, in der Group By - Klause aufgeführt sein müssen.

Daher ist die Fehlermeldung ganz Okay!!

Ich nehme mal dein erstes Stmt und versuch mein GLück... ;-)

Code:
SELECT Land, AnzahlTore, Spiel_id FROM (
                                           SELECT Land, Sum(tore) as AnzahlTore, Spiel_id 
                                           FROM SPIELER,SPIELT
                                           WHERE Spieler.spieler_id = Spielt.Spieler_id
                                           GROUP BY Land, Spiel_id
                                       )[B]tb[/B]

where AnzahlTore = ( select MAX(AnzahlTore) 
                        FROM (select Sum(tore) as AnzahlTore, Spiel_id
                                  FROM SPIELER,SPIELT
                                  WHERE Spieler.spieler_id = Spielt.Spieler_id
                             )
                        where Spiel_id = [B]tb.Spiel_id[/B]
                   )
GROUP BY  Spiel_id


Lg
 

sarte

Benutzer
Beiträge
5
Danke, aber trotzdem kriege ich eine Fehlermeldung für:
Code:
SELECT Land, AnzahlTore, Spiel_id FROM (
                                          SELECT Land, Sum(tore) as AnzahlTore, Spiel_id
                                          FROM SPIELER,SPIELT
                                          WHERE Spieler.spieler_id = Spielt.Spieler_id
                                          GROUP BY Land, Spiel_id
                                      )as tb
 
WHERE AnzahlTore = (    SELECT MAX(AnzahlTore)
                        FROM (    SELECT Sum(tore) as AnzahlTore, Spiel_id
                                  FROM SPIELER,SPIELT
                                  WHERE Spieler.spieler_id = Spielt.Spieler_id
                            )
                        WHERE Spiel_id = tb.Spiel_id
                  )
GROUP BY  Spiel_id

Auch wenn ich GROUP BY Spiel_id weglasse, ich verstehe DB2 einfach nicht, irgendwie ist es seltsam :p

Falls du die Fehlermeldung lesen möchtest:

SELECT Land, AnzahlTore, Spiel_id FROM ( SELECT Land, Sum(tore) as AnzahlTore, Spiel_id FROM SPIELER,SPIELT WHERE Spieler.spieler_id = Spielt.Spieler_id GROUP BY Land, Spiel_id )as tb WHERE AnzahlTore = ( SELECT MAX(AnzahlTore) FROM ( SELECT Sum(tore) as AnzahlTore, Spiel_id FROM SPIELER,SPIELT WHERE Spieler.spieler_id = Spielt.Spieler_id ) WHERE Spiel_id = tb.Spiel_id ) GROUP BY Spiel_id
SQL0119N Ein mit "SPIEL_ID" beginnender und in einer Klausel SELECT, HAVING
bzw. ORDER BY angegebener Ausdruck fehlt in der Klausel GROUP BY, oder der
Ausdruck ist Teil einer Klausel SELECT, HAVING bzw. ORDER BY mit einer
Spaltenfunktion, für die die Klausel GROUP BY nicht angegeben wurde.
SQLSTATE=42803

SQL0119N Ein mit "SPIEL_ID " beginnender und in einer Klausel SELECT, HAVING bzw. ORDER BY angegebener Ausdruck fehlt in der Klausel GROUP BY, oder der Ausdruck ist Teil einer Klausel SELECT, HAVING bzw. ORDER BY mit einer Spaltenfunktion, für die die Klausel GROUP BY nicht angegeben wurde.
 

sarte

Benutzer
Beiträge
5
Okay ich sehe gerade das Problem, es liegt in dem Bereich, aber ich verstehe nicht was daran falsch ist total komisch
Code:
  SELECT Sum(tore) as AnzahlTore, Spiel_id
                                  FROM SPIELER,SPIELT
                                  WHERE Spieler.spieler_id = Spielt.Spieler_id
 

sarte

Benutzer
Beiträge
5
Code:
SELECT Land, AnzahlTore, Spiel_id FROM (
                                          SELECT Land, Sum(tore) as AnzahlTore, Spiel_id
                                          FROM SPIELER,SPIELT
                                          WHERE Spieler.spieler_id = Spielt.Spieler_id
                                          GROUP BY Land, Spiel_id
                                      )as tb
 
WHERE AnzahlTore = (    SELECT MAX(AnzahlTore)
                        FROM (    SELECT Sum(tore) as AnzahlTore, Spiel_id
                                  FROM SPIELER,SPIELT
                                  WHERE Spieler.spieler_id = Spielt.Spieler_id
                                  Group by Spiel_id
                            )
                        WHERE Spiel_id = tb.Spiel_id
           
                  )
GROUP BY  Spiel_id

Bin jetzt weiter gekommen, weil ich Group by Spiel_id hinzugefügt habe, aber jetzt geht Max(AnzahlTore) nicht, also der gleiche Fehler:
SQLSTATE=42803

SQL0119N Ein mit "ANZAHLTORE " beginnender und in einer Klausel SELECT, HAVING bzw. ORDER BY angegebener Ausdruck fehlt in der Klausel GROUP BY, oder der Ausdruck ist Teil einer Klausel SELECT, HAVING bzw. ORDER BY mit einer Spaltenfunktion, für die die Klausel GROUP BY nicht angegeben wurde.

Erläuterung:
 

ukulele

Datenbank-Guru
Beiträge
4.637
Diese verschachtelten SELECTs sind auch total gruselig. Wenn du noch hilfe brauchst poste bitte mal die wesentlichen Tabellen(Spalten) und was du abfragen möchtest. Prinzipiell muss alles, was im SELECT Teil steht auch bei GROUP BY oder HAVING stehen, oder du arbeitest mit min(), max(), avg oder sum() im SELECT Teil.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.520
Hey,
wieso spinnt Group by und Having bei DB2? In MySQL geht alles wunderbar...
Hier habe ich eine ganz einfache Abfrage und ich will die gruppieren nach der ID, aber das Land will ich mit haben:

Code:
SELECT Land, Max(AnzahlTore)as Gewinner, Spiel_id FROM (
                        ...
            )
        GROUP BY  Spiel_id
Aber wenn ich Land mit in die SELECT nehme, dann werde ich gezwungen Land auch zu gruppieren, aber das will ich ja nicht!


Nur um das noch mal ganz klar zu sagen: die Tatsache, daß das in MySQL geht und in vermutlich ALLEN ANDEREN DATENBANKEN nicht heißt nicht, daß MySQL es richtig macht.
Der Fehler liegt ganz klar bei MySQL, und wenn man MySQL im STRICT-Mode fährt, geht es auch in MySQL nicht.

In Abfragen mit Aggregatfunktionen müssen alle Spalten entweder im GROUP BY oder aber Resultat einer Aggregation sein, ansonsten ist die Abfrage nicht eindeutig. Das MySQL das nicht prüft ist ungefähr genau so falsch wie dessen Umgang mit CHECK-Constraints, die es annimmt aber nicht durchsetzt. MySQL liefert u.U. also völlig falsche Resultate, wenn man sich nicht an diese Regel hält, so wie es Werte akzeptiert, die eigentlich aufgrund des CHECK-Constraints nicht erlaubt sind.

MySQL mag einfach sein, aber es ist weder Anfängerfreundlich (weil es Anfängern grobe Fehler erlaubt) noch Benutzerfreundlich, weil es nicht das tut, was man gemäß SQL-Spezifikation erwartet. Es gibt mehr als genug Alternativen.


Andreas
 
Oben