MySQL SUM->Problem
Bobby
- datenbank
Moin
ich hab folgende SQL Abfrage:
SELECT
SQL_CALC_FOUND_ROWS KLIENT.KLIENT_ID,
KLIENT.KLIENT_VORNAME,
KLIENT.KLIENT_NAME,
STUNDEN.MODELL,
STUNDEN.STUNDEN,
STUNDEN.BEGINN,
STUNDEN.ENDE,
EREIGNIS.*,
FACHKRAFT.FACHKRAFT_NAME,
DATE_FORMAT(EREIGNIS.VON,GET_FORMAT(DATE,'EUR')) DATUM,
CONCAT(DATE_FORMAT(EREIGNIS.VON,'%H:%i'),'-',DATE_FORMAT(EREIGNIS.BIS,'%H:%i') )ZEIT,
SUM((HOUR(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))+(MINUTE(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))/60))) SUMME,
(HOUR(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))+(MINUTE(TIMEDIFF(EREIGNIS.BIS,EREIGNIS.VON))/60)) DAUER
FROM KLIENT
LEFT JOIN `EREIGNIS` ON (KLIENT.KLIENT_ID=EREIGNIS.KLIENT_ID AND MONTH(VON) = '12' AND YEAR(VON)='2008')
LEFT JOIN `FACHKRAFT` ON (FACHKRAFT.FACHKRAFT_ID=EREIGNIS.FACHKRAFT_ID)
LEFT JOIN `STUNDEN` 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. Macht es aber nicht. In der TAbelle EREIGNISSE sind mehrere Ereignisse enthalten, die auch ordentlich ausgelesen werden. Nur die Summe macht es nicht. Hat jemand ne Idee warum?
Gruß Bobby
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
Moin
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.
Danke. Das war die Erklärung. Es sind unterschiedliche EREIGNIS.IDs. Ich wollte die Ereignisstunden für eine KLIENT.KLIENT_ID summieren.
Es erscheinen übrigens ca 20 Ereignisse als Ergebnis der Abfrage ohne SUM und GROUP. Ich werde nun im PHP die Werte summieren. Ich dachte ich kann dies direkt im STATEMENT tun.
Gruß Bobby
moin,
Es erscheinen übrigens ca 20 Ereignisse als Ergebnis der Abfrage ohne SUM und GROUP. Ich werde nun im PHP die Werte summieren. Ich dachte ich kann dies direkt im STATEMENT tun.
das kannst du auch, du wendest es nur falsch an. es ist immer besser, nicht nur das sql statement zum besten zu geben, sondern viel wichtiger sind die betroffenen tabellen, beispieldatensätze und in worten mit einer beispiel ergebnismenge was du erreichen willst. dann ist dier hier schnell geholfen.
Ilja
Moin
das kannst du auch, du wendest es nur falsch an. es ist immer besser, nicht nur das sql statement zum besten zu geben, sondern viel wichtiger sind die betroffenen tabellen, beispieldatensätze und in worten mit einer beispiel ergebnismenge was du erreichen willst. dann ist dier hier schnell geholfen.
Ilja
Gut, dann will ich mal
es gibt 3 TAbellen. Ich werde jetzt nur die relevanten Werte angeben
KLIENT_ID, KLIENT_NAME
1 Name1
2 Name2
STUNDEN_ID | KLIENT_ID | MODELL | BEGINN | ENDE, | DATUM
1 | 1 | klassisch | 2009-01-02 | 2010-12-01 | 2009-01-01
2 | 1 | pool | 2009-10-02 | 2010-12-01 | 2009-10-01
3 | 2 | klassisch | 2009-01-02 | 2010-12-01 | 2009-01-01
4 | 2 | pool | 2009-10-02 | 2010-12-01 | 2009-10-01
EREIGNIS_ID | KLIENT_ID | VON | BIS
1 | 1 | 2009-03-02 12:30 | 2010-12-01 13:30
2 | 1 | 2009-03-03 08:30 | 2010-12-01 10:15
3 | 1 | 2009-03-04 17:45 | 2010-12-01 18:30
4 | 2 | 2009-05-02 09:15 | 2010-12-01 10:45
5 | 2 | 2009-05-06 18:45 | 2010-12-01 19:45
6 | 2 | 2009-05-09 06:30 | 2010-12-01 10:15
So, nun möchte ich _ALLE_ Ereignisse eines Klienten mit seinen DAten und seinem aktiven Stundenmodell (sprich das letzt eingetragene -> Feld DATUM)
Ich hoffe nun ist etwas klaerer was ich möchte.
Gruß Bobby
moin
So, nun möchte ich _ALLE_ Ereignisse eines Klienten mit seinen DAten und seinem aktiven Stundenmodell (sprich das letzt eingetragene -> Feld DATUM)
Ich hoffe nun ist etwas klaerer was ich möchte.
klarer auf jeden fall, allerdings wäre es von vorteil, wenn du (wie bereits erwähnt) noch mal die gewünschte ergebnismenge angeben könntest, wie du dir die ausgabe wünscht bei deinen beispieldaten.
Ilja
Moin
klarer auf jeden fall, allerdings wäre es von vorteil, wenn du (wie bereits erwähnt) noch mal die gewünschte ergebnismenge angeben könntest, wie du dir die ausgabe wünscht bei deinen beispieldaten.
OK anhand meiner Beispieldaten:
KLIENT_ID, KLIENT_NAME
1 Name1
2 Name2
STUNDEN_ID | KLIENT_ID | MODELL | BEGINN | ENDE, | DATUM
1 | 1 | klassisch | 2009-01-02 | 2010-12-01 | 2009-01-01
2 | 1 | pool | 2009-10-02 | 2010-12-01 | 2009-10-01
3 | 2 | klassisch | 2009-01-02 | 2010-12-01 | 2009-01-01
4 | 2 | pool | 2009-10-02 | 2010-12-01 | 2009-10-01
EREIGNIS_ID | KLIENT_ID | VON | BIS
1 | 1 | 2009-03-02 12:30 | 2009-03-02 13:30
2 | 1 | 2009-03-03 08:30 | 2009-03-03 10:15
3 | 1 | 2009-03-04 17:45 | 2009-03-04 18:30
4 | 2 | 2009-05-02 09:15 | 2009-05-02 10:45
5 | 2 | 2009-05-06 18:45 | 2009-05-06 19:45
6 | 2 | 2009-05-09 06:30 | 2009-05-09 10:15
Also ich möchte für Klient 1 alle Ereignisse die im Monat März stattgefunden haben. Und außerdem möchte ich die für den März gültige Stundenvereinbarung. Also so:
KLIENT_ID | KLIENT_NAME | STUNDEN_ID | MODELL | BEGINN | ENDE | EREIGNIS_ID | EREIGNIS_DATUM | VON | BIS | DAUER | GESAMT
1 | Name1 | 1 | klassisch | 2009-01-02 | 2010-01-01 | 1 | 2009-03-02 | 12:30 | 13:30 | 1 | 3.5
1 | Name1 | 1 | klassisch | 2009-01-02 | 2010-01-01 | 2 | 2009-03-03 | 08:30 | 10:15 | 1.75 | 3.5
1 | Name1 | 1 | klassisch | 2009-01-02 | 2010-01-01 | 3 | 2009-03-02 | 17:45 | 18:30 | 0.75 | 3.5
OK. Mir ist grad selbst klar geworden wies funktioniert. Mit einem Subselect. Danke trotzdem für den Anstoss
Gruß Bobby