Johnny B.: [mySQL] LEFT JOIN - WITH ROLLUP rechnet nicht zusammen

Hallo geehrtes Forum,

gegeben sei folgender Query:

SELECT  DATE_FORMAT( statistik.datum, '%d.%m.%Y') Date,  
        COUNT(CASE WHEN typ = 'C' THEN 1 ELSE NULL END) Clicks,  
        kosten  
FROM statistik  
LEFT JOIN kosten ON kosten.datum = statistik.datum  
WHERE YEAR( statistik.datum ) = '$jahr' AND MONTH( statistik.datum ) = '$monat'  
GROUP BY statistik.datum WITH ROLLUP

Die Ausgabe verwirrte mich: während Clicks wie erwartet in der Rollup-Zeile zusammengerechnet wird, zeigt die Rollup-Zeile für kosten _nicht_ die Summe, sondern den Eintrag der letzten Zeile.

statistik:
 id | datum      | typ
----+------------+------
  1 | 2010-04-10 | C
  2 | 2010-04-10 | C
  3 | 2010-04-11 | C

kosten:
 id | datum      | kosten
----+------------+-------
  1 | 2010-04-10 | 5.00
  2 | 2010-04-11 | 6.00

Ergebnis:
Date       | Clicks | kosten
-----------+--------+--------
10.04.2010 | 2      | 5
11.04.2010 | 1      | 6
           | 3      | 6       <= ROLLUP-Zeile

Die ROLLUP-Zeile sollte natürlich so aussehen
           | 3      | 11

Wieso tut sie das nicht?!?

Besten Gruß
JOhnnY

  1. Hallo,

    gegeben sei folgender Query:

    SELECT  DATE_FORMAT( statistik.datum, '%d.%m.%Y') Date,

    COUNT(CASE WHEN typ = 'C' THEN 1 ELSE NULL END) Clicks,
            kosten
    FROM statistik
    LEFT JOIN kosten ON kosten.datum = statistik.datum
    WHERE YEAR( statistik.datum ) = '$jahr' AND MONTH( statistik.datum ) = '$monat'
    GROUP BY statistik.datum WITH ROLLUP

      
    ok, das kaputte SQL läßt darauf schließen, dass Du mit extrem hoher Wahrscheinlichkeit MySQL verwendest, weil jedes vernünftige Datenbankmanagementsystem statt eines Ergebnisses eine Fehlermeldung zurückliefert.  
      
    
    > Die Ausgabe verwirrte mich: während Clicks wie erwartet in der Rollup-Zeile zusammengerechnet wird, zeigt die Rollup-Zeile für kosten \_nicht\_ die Summe, sondern den Eintrag der letzten Zeile.  
      
    
    > Wieso tut sie das nicht?!?  
      
    weil Du auf Kosten keine Aggregatsfunktion anwendest und auch nicht danach gruppierst.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hallo Vinzenz,

      ok, das kaputte SQL läßt darauf schließen, dass Du mit extrem hoher Wahrscheinlichkeit MySQL verwendest, weil jedes vernünftige Datenbankmanagementsystem statt eines Ergebnisses eine Fehlermeldung zurückliefert.

      ja, richtig geraten ;-) (siehe Thread-Titel). Aber wieso kaputtes SQL?

      weil Du auf Kosten keine Aggregatsfunktion anwendest und auch nicht danach gruppierst.

      Ich dachte die unteren Gruppierungen und das Rollup würden sich auf das SELECT und auch den LEFT JOIN beziehen.

      Meine Probleme sind damit aber nicht vorbei. Zuerst habe ich festgestellt, daß, wenn zwei Einträge in ´kosten´ für dasselbe Datum bestehen, diese nicht zusammengerechnet werden.

      Dann habe ich entdeckt, daß die Berechnung der Clicks auch nicht mehr stimmt, sobald mehrere Einträge in ´kosten´ für ein Datum bestehen. Bei zwei Einträgen zählt er die Clicks doppelt, bei drei Einträgen dreifach.

      Daher vermute ich, daß mein grundlegender Ansatz vielleicht falsch ist.

      SELECT  DATE_FORMAT( statistik.datum, '%d.%m.%Y') Date,  
              COUNT(CASE WHEN typ = 'C' THEN 1 ELSE NULL END) Clicks,  
              (   SELECT SUM(summe)  
                  FROM kosten  
                  WHERE kosten.datum = statistik.datum $aktion_id_passt  
              )                                               Kosten  
      FROM statistik
      

      ...

      Nun war ich grad so stolz, meinen ersten LEFT JOIN ohne fremde Hilfe eingesetzt zu haben - und nun fliegt mir hier alles um die Ohren.

      Was ich will:
      1. zähle in Tabelle ´statistik´ alle Vorkommen des Typ 'C' gruppiert zu einem Datum zusammen
      2. rechne in Tabelle ´kosten´ alle Vorkommen von ´summe´ gruppiert zu einem Datum zusammen
      3. gebe beides zusammen in einer Tabelle aus

      Sollte ich da besser mit UNION arbeiten?

      Besten Gruß
      JOhnnY

      1. Hallo Vinzenz,

        Was ich will:

        1. zähle in Tabelle ´statistik´ alle Vorkommen des Typ 'C' gruppiert zu einem Datum zusammen
        2. rechne in Tabelle ´kosten´ alle Vorkommen von ´summe´ gruppiert zu einem Datum zusammen
        3. gebe beides zusammen in einer Tabelle aus

        Sollte ich da besser mit UNION arbeiten?

        Ich hab es jetzt mit einem einfachen Subselect gelöst. Manchmal hilft es, einfach zu denken. ...

        Besten Gruß und Danke!
        JOhnnY