[mySQL] LEFT JOIN - WITH ROLLUP rechnet nicht zusammen
Johnny B.
- datenbank
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
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
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
Hallo Vinzenz,
Was ich will:
- zähle in Tabelle ´statistik´ alle Vorkommen des Typ 'C' gruppiert zu einem Datum zusammen
- rechne in Tabelle ´kosten´ alle Vorkommen von ´summe´ gruppiert zu einem Datum zusammen
- 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