Bobby: MySQL SUM->Problem

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

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
### Henry L. Mencken ###
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
## Viktor Frankl ###
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. 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 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.  
      
    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
    
    1. 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

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ## Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. 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

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

          Tabelle KLIENT

          KLIENT_ID, KLIENT_NAME
          1          Name1
          2          Name2

          Tabelle STUNDEN

          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

          Tabelle EREIGNIS

          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

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          ### Henry L. Mencken ###
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ## Viktor Frankl ###
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. 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

            1. 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:

              Tabelle KLIENT

              KLIENT_ID, KLIENT_NAME
              1          Name1
              2          Name2

              Tabelle STUNDEN

              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

              Tabelle EREIGNIS

              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

              --
              -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
              ### Henry L. Mencken ###
              -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
              ## Viktor Frankl ###
              ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)