Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

DB2: Probleme mit Group by

Dieses Thema im Forum "DB2" wurde erstellt von sarte, 21 Juni 2012.

  1. sarte

    sarte Benutzer

    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:
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
  3. sarte

    sarte Benutzer

    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:

     
  4. sarte

    sarte Benutzer

    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
     
  5. sarte

    sarte Benutzer

    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:
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
  7. akretschmer

    akretschmer Datenbank-Guru


    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
     
    PLSQL_SQL gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden