Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL SUM

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL SUM

    Hallo,

    ich bräuchte mal eure Hilfe bei einer Datenbankabfrage.

    Code:
    SELECT 
        project_list.project_id, 
        SUM(shiftplan_workingtime_current.shiftplan_workingtime_hour) AS `shiftplan_workingtime_hour_current`,
        SUM(shiftplan_workingtime_previous_month.shiftplan_workingtime_hour) AS `shiftplan_workingtime_hour_previous_month`
    
    FROM project_list
    
    LEFT JOIN shiftplan_workingtime AS `shiftplan_workingtime_current` ON shiftplan_workingtime_current.project_id = project_list.project_id AND shiftplan_workingtime_current.shiftplan_workingtime_date BETWEEN '2017-08-01' AND '2017-08-31' 
    LEFT JOIN shiftplan_workingtime AS `shiftplan_workingtime_previous_month` ON  shiftplan_workingtime_previous_month.project_id = project_list.project_id AND shiftplan_workingtime_previous_month.shiftplan_workingtime_date BETWEEN '2017-07-01' AND '2017-07-31' 
    
    GROUP BY
        project_list.project_id 
    
    ORDER BY 
        shiftplan_workingtime_hour_current, 
        project_list.project_name 
    ASC
    Ich möchte für jedes Projekt die Summe der Arbeitszeiten vom Vormonat und vom aktuellen Monat ermitteln.
    Wenn ich die Daten einzeln auslese (also z. B. nur vom aktuellen Monat), funktioniert das so, wie es soll.
    Aber mit zwei Left Join's werden die Werte irgendwie öfters summiert.

    Muss ich das in zwei Abfragen auslagern, oder hat jemand einen Tipp für mich?
    Vielen Dank im Voraus.
    Man friert nur, wenn man glaubt, einem sei kalt

  • #2
    Ich glaube ich habe mir die Frage selbst beantwortet:

    Code:
    SELECT
        project_list.project_id,
        shiftplan_workingtime_current.shiftplan_workingtime_hour AS `shiftplan_workingtime_hour_current`,
        shiftplan_workingtime_previous_month.shiftplan_workingtime_hour AS `shiftplan_workingtime_hour_previous_month`
    
    FROM project_list
    
    LEFT JOIN
    (
        SELECT
            shiftplan_workingtime.project_id,
            SUM(shiftplan_workingtime.shiftplan_workingtime_hour) AS `shiftplan_workingtime_hour`
        FROM
            shiftplan_workingtime
        WHERE
            shiftplan_workingtime.shiftplan_workingtime_date BETWEEN '2017-08-01' AND '2017-08-31'
        GROUP BY
            shiftplan_workingtime.project_id
    ) AS `shiftplan_workingtime_current` ON shiftplan_workingtime_current.project_id = project_list.project_id
    
    LEFT JOIN
    (
        SELECT
            shiftplan_workingtime.project_id,
            SUM(shiftplan_workingtime.shiftplan_workingtime_hour) AS `shiftplan_workingtime_hour`
        FROM
            shiftplan_workingtime
        WHERE
            shiftplan_workingtime.shiftplan_workingtime_date BETWEEN '2017-07-01' AND '2017-07-31'
        GROUP BY
            shiftplan_workingtime.project_id
    ) AS `shiftplan_workingtime_previous_month` ON  shiftplan_workingtime_previous_month.project_id = project_list.project_id  
    
    ORDER BY
        shiftplan_workingtime_hour_current,
        project_list.project_name
    ASC
    Ich summiere die Daten bereits in den LEFT JOIN's und das scheint sogar noch schneller zu sein.
    Oder gibt es noch bessere Wege?
    Man friert nur, wenn man glaubt, einem sei kalt

    Kommentar


    • #3
      Code:
      SELECT
          wt.project_id,
          SUM(wt.shiftplan_workingtime_hour) AS shiftplan_workingtime_hour,
          YEAR(wt.shiftplan_workingtime_date) AS shiftplan_year,
          MONTH(wt.shiftplan_workingtime_date) AS shiftplan_month
      FROM
          shiftplan_workingtime wt
      WHERE
          YEAR(wt.shiftplan_workingtime_date) = 2017
          AND MONTH(wt.shiftplan_workingtime_date) IN (7, 8)
      GROUP BY
          wt.project_id,
          YEAR(wt.shiftplan_workingtime_date),
          MONTH(wt.shiftplan_workingtime_date)

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Code:
        WHERE
        YEAR(wt.shiftplan_workingtime_date) = 2017
        AND MONTH(wt.shiftplan_workingtime_date) IN (7, 8)
        Auf stark selektive Spalten sollte im WHERE keine Funktion angewendet werden. Das hebelt dir ggf. den Index aus. Besser:

        Code:
        WHERE wt.shiftplan_workingtime_date BETWEEN '2017-07-01 ' AND '2017-08-31'
        und das erspart auch beim Jahreswechsel Kopfschmerzen...

        Kommentar


        • #5
          Hm, danke euch.
          Das ist wesentlich kürzer als meine Variante, wieder was gelernt.

          Aber dadurch tut sich bei der Sortierung ein neues Problem auf.
          Das Ergebnis soll in Tabellenform dargestellt werden:

          Projekt | Arbeitszeit Vormonat | Arbeitszeit aktueller Monat

          Bei Sortierung nach Projekt ist das kein Problem für mich/Gruppenbruch mit Projekt und das Array dann mit foreach durchlaufen.
          PHP-Code:
              while($dataComparison $rComparison->fetch_object())
              {
                  if(
          $value != $dataComparison->project_id)
                  {
                      
          $value $dataComparison->project_id;
                  }
                  
          $arrWt[$value][$dataComparison->shiftplan_month] = $dataComparison->shiftplan_workingtime_hour;
              } 
          Aber bei der Sortierung nach Arbeitszeit des aktuellen Monats schon (im Beispiel 08 ).
          Klar, ich könnte das Ergebnis erstmal nach Monat und dann nach Arbeitszeit vorsortieren. Das Problem liegt aber beim Aufbau des Arrays.
          Man friert nur, wenn man glaubt, einem sei kalt

          Kommentar


          • #6
            Zitat von stiff82 Beitrag anzeigen
            Aber dadurch tut sich bei der Sortierung ein neues Problem auf.
            Das Ergebnis soll in Tabellenform dargestellt werden:

            Projekt | Arbeitszeit Vormonat | Arbeitszeit aktueller Monat
            Dann nimm dein letzten Query...

            Kommentar

            Lädt...
            X