Hallo,
ich hab folgende SQL Abfrage:
SELECT
SQL_CALC_FOUND_ROWS KLIENT.KLIENT_ID,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
KLIENT.KLIENT_VORNAME,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
KLIENT.KLIENT_NAME,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
STUNDEN.MODELL,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
STUNDEN.STUNDEN,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
STUNDEN.BEGINN,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
STUNDEN.ENDE,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
EREIGNIS.*,
-- nach allen Spalten außer der ID gruppierst Du nicht und wendest keine Aggregatsfunktion darauf an. Da diese vermutlich alle von der ID abhängig sind, greift hier die MySQL-Erweiterung.
FACHKRAFT.FACHKRAFT_NAME,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an.
DATE_FORMAT(EREIGNIS.VON,GET_FORMAT(DATE,'EUR')) DATUM,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an, dürfte aber direkt von EREIGNIS.ID abhängen.
CONCAT(DATE_FORMAT(EREIGNIS.VON,'%H:%i'),'-',DATE_FORMAT(EREIGNIS.BIS,'%H:%i') )ZEIT,
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an, dürfte aber direkt von EREIGNIS.ID abhängen.
SUM((HOUR(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))+(MINUTE(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))/60))) SUMME,
-- wieviele Datensätze gibt's zu einer EREIGNIS.ID?
-- Mehr als einen?
-- Wenn nein, was sollte Deiner Erwartung nach summiert werden?
(HOUR(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))+(MINUTE(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))/60)) DAUER
-- nach dieser Spalte gruppiertst Du nicht und Du wendest keine Aggregatsfunktion darauf an, dürfte aber direkt von EREIGNIS.ID abhängen.
FROM KLIENT
LEFT JOINEREIGNIS
ON (KLIENT.KLIENT_ID=EREIGNIS.KLIENT_ID AND MONTH(VON) = '12' AND YEAR(VON)='2008')
LEFT JOINFACHKRAFT
ON (FACHKRAFT.FACHKRAFT_ID=EREIGNIS.FACHKRAFT_ID)
LEFT JOINSTUNDEN
ON (STUNDEN.KLIENT_ID=KLIENT.KLIENT_ID AND '2008-12-01' BETWEEN STUNDEN.BEGINN AND STUNDEN.ENDE)
WHERE KLIENT.KLIENT_ID='37'
GROUP BY EREIGNIS.EREIGNIS_ID
ORDER BY STUNDEN.DATUM DESC
> SUM((HOUR(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))+(MINUTE(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))/60))) SUMME,
> Soll mir eigentlich die Zeitdifferenzen zusammenzählen.
Welche?
Die zu \*einer\* Gruppierung. Das ist bei Dir \*eine\* ID. Vermutlich gibt's genau den einen Wert.
> Macht es aber nicht.
Ich kann mir nicht vorstellen, dass es etwas zu summieren gibt. Du hast vermutlich eine falsche Erwartungshaltung.
> In der TAbelle EREIGNISSE sind mehrere Ereignisse enthalten, die auch ordentlich ausgelesen werden. Nur die Summe macht es nicht. Hat jemand ne Idee warum?
Du fällst auf MySQL und seinen laxen, aber dokumentierten, Umgang mit nicht aggregierten Spalten herein. Jedes andere mir bekannte DBMS würde Dir auf dieses Statement einfach mit einer Fehlermeldung antworten. MySQL bietet einen Modus an, der das auch macht. Ich finde den gut.
Wieviele Datensätze je unterschiedlicher EREIGNIS.ID erhältst Du, wenn Du auf die SUM()-Spalte und die Gruppierung verzichtest?
Deine SUM-Spalte wirkt sich nur auf die jeweiligen Datensätze aus, die gruppiert werden, d.h. nur wenn es mehrere Datensätze zur gleichen EREIGNIS.ID gibt, kann SUM() greifen.
Freundliche Grüße
Vinzenz