Announcement

Collapse
No announcement yet.

NULL Werte bei Gruppierung mit ausgeben.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • NULL Werte bei Gruppierung mit ausgeben.

    Hallo,

    ich habe hier eine kleine Abfrage, die - verkürzt dargestellt - in etwa so aussieht:

    Code:
    SELECT
    week(`einsatzplanung`.`Von`,1) as KW,
    Sum(`erg_data_produkt`.`Verkauf`) AS `Verkauf`
    FROM
    `erg_data_produkt`
    Inner Join `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
    Inner Join `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
    Group by week(`einsatzplanung`.`Von`)
    Als Ergebniss erhalte ich die Summe aller Verkäufe nach KW gruppiert:

    KW|Verkauf
    1 | 122
    2 | 200
    4 | 156
    5 | 180

    Wenn es, wie hier im Beispiel, in der KW3 keine Verkäufe gab, wird für diese KW auch keine Zeile ausgegeben, was die Weiterverarbeitung erschwert.
    Wie kann ich diese "Leerzeilen" mit ausgeben? Gibt es da eine Möglichkeit?
    Wäre sehr schön wenn das Ergebniss so oder so ähnlich aussehen würde:

    KW|Verkauf
    1 | 122
    2 | 200
    3 | NULL
    4 | 156
    5 | 180

  • #2
    Originally posted by aba View Post
    Hallo,

    ich habe hier eine kleine Abfrage, die - verkürzt dargestellt - in etwa so aussieht:

    Code:
    SELECT
    week(`einsatzplanung`.`Von`,1) as KW,
    Sum(`erg_data_produkt`.`Verkauf`) AS `Verkauf`
    FROM
    `erg_data_produkt`
    Inner Join `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
    Inner Join `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
    Group by week(`einsatzplanung`.`Von`)
    Als Ergebniss erhalte ich die Summe aller Verkäufe nach KW gruppiert:

    KW|Verkauf
    1 | 122
    2 | 200
    4 | 156
    5 | 180

    Wenn es, wie hier im Beispiel, in der KW3 keine Verkäufe gab, wird für diese KW auch keine Zeile ausgegeben, was die Weiterverarbeitung erschwert.
    Wie kann ich diese "Leerzeilen" mit ausgeben? Gibt es da eine Möglichkeit?
    Wäre sehr schön wenn das Ergebniss so oder so ähnlich aussehen würde:

    KW|Verkauf
    1 | 122
    2 | 200
    3 | NULL
    4 | 156
    5 | 180
    Wie wärs damit: (vielleicht sollte man auch noch das Jahr dazunehmen)
    Code:
    SELECT  KW
         ,  Verkauf
    FROM  (SELECT  week(`einsatzplanung`.`Von`,1) as KW
                ,  Sum(`erg_data_produkt`.`Verkauf`) AS `Verkauf`
           FROM`erg_data_produkt`
           JOIN `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
           JOIN `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
           GROUP BY week(`einsatzplanung`.`Von`)
          ) AS X
    LEFT JOIN (SELECT DISTINCT week(`einsatzplanung`.`Von`,1) as KW
               FROM`erg_data_produkt`
              ) AS y ON X.KW = Y.KW

    Comment


    • #3
      Oder du wandelst die NULL vorher in einen Integer Wert 0 um. Dann passt die Summe und er ignoriert sie nicht

      Comment


      • #4
        Hallo,

        vielen Dank für eure Anworten.
        @Ebis:
        Deine Abfrage habe ich leider noch nicht zum Laufen bekommen. Irgendwo sind da anscheinend noch 1-2 Fehler drin. Leider geht mein Verständnis von SQL nicht allzu weit.
        So ausgeführt kommt der Fehler "Unknown Coloumn 'Einsatzplanung.von' in 'field list'. Vermutlich liegt das an dem letzten Teil der Abfrage, also habe ich hier die Tabellenvernüpfungen noch eingefügt.

        Code:
        LEFT JOIN (SELECT DISTINCT week(`einsatzplanung`.`Von`,1) as KW
                   FROM`erg_data_produkt`
               JOIN `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
               JOIN `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
                  ) AS y ON X.KW = Y.KW

        Nun kommt die Meldung "Column KW in field List is ambigiuous". Liegt vermutlich an dem
        Code:
        SELECT  KW
             ,  Verkauf
        Hier wird wohl ein X.KW oder ein Y.KW erwartet (was genau weiß ich leider nicht). Habe beides ausprobiert, aber nicht das gewünschte Ergebniss (NULLer-Leerzeilen) erhalten.
        Hier noch mal die gesammte Abfrage, wie sie bei mir steht. Um die Ergebnisse einzugrenzen ist das Feld einsatzplanung.produkt in der WHERE Klausel hinzugekommen.
        Code:
        SELECT  x.KW
             ,  Verkauf
        FROM  (SELECT  week(`einsatzplanung`.`Von`,1) as KW
                    ,  Sum(`erg_data_produkt`.`Verkauf`) AS `Verkauf`
               FROM`erg_data_produkt`
               JOIN `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
               JOIN `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
               where einsatzplanung.produkt="Suppen"
               GROUP BY week(`einsatzplanung`.`Von`)
              ) AS X
        LEFT JOIN (SELECT DISTINCT week(`einsatzplanung`.`Von`,1) as KW
                   FROM`erg_data_produkt`
               JOIN `erg_data` ON `erg_data`.`Data_ID` = `erg_data_produkt`.`Data_ID`
               JOIN `einsatzplanung` ON `einsatzplanung`.`Plan_Nr` = `erg_data`.`Plan_Nr`
                  ) AS y ON X.KW = Y.KW
        Zur besseren Visualisierung das (vereinfachte) Design der Datenbank
        Einsatzplanung
        Plan_Nr|von|Produkt
        -------

        Ergdata
        Data_ID|Plan_Nr
        -------

        Erg_Data_Produkt
        ID|Data_ID|Verkauf
        --

        @fanderlf:
        wie meinst Du das? Das Feld erg_data_produkt.Verkauf ist in der Datenbank als Integerwert eingerichtet. Aber wenn es in einer Woche kein Verkauf gab stehen auch keine DS in der Tabelle.? Verstehe dich leider (noch) nicht.

        Gruß aba

        Comment


        • #5
          Aso da hatte ich was falsch verstanden. Ich dachte da stehen NULL Werte in der Datenbank und die werden bei der Gruppierung ignoriert.
          Wenn es dazu keine Daten gibt, dann musst Du natürlich einen Left Join anwenden. Beim inner join landen nur Datensätze im Ergebnis bei dem zu einem primary key auch ein passender foreign key gefunden wird.
          Bei einem left join landet jeder datensatz mit einem primary key im Ergebnis auch wenn im join kein passender foreign key existiert

          Comment


          • #6
            Wenn es dazu keine Daten gibt, dann musst Du natürlich einen Left Join anwenden. Beim inner join landen nur Datensätze im Ergebnis bei dem zu einem primary key auch ein passender foreign key gefunden wird.
            Bei einem left join landet jeder datensatz mit einem primary key im Ergebnis auch wenn im join kein passender foreign key existiert
            Args, da hätte ich ja auch selbst drauf kommen. Werde am Montag probieren, ob es wirklich so einfach funktioniert. Jetzt ist erstmal Wochenende
            Gruß aba

            Comment


            • #7
              Da war am Freitag wohl das Wochenende schon zu Nah.
              Hab nicht daran gedacht, dass ich in der Tabelle Einsatzplanung auch nicht jede Woche ein Einsatz (mit einem bestimmten Produkt, welches in der Where-Klausel gefiltert wird) habe. Insofern funktioniert die LEFT JOIN Geschichte leider auch nicht.

              Comment


              • #8
                Ich überprüfe die Rückgabe der Abfrage nun im Quellcode und füge Kalenderwochen mit NULL-Werten bei Bedarf hinzu.
                Das funktioniert erwartungsgemäß ganz gut, schöner wäre es natürlich trotzdem die Aufgabe per SQL zu lösen.

                Die Dringlichkeit ist also weg, das Interesse an der Lösung ist aber trotzdem geblieben.
                Falls jemand noch eine Idee haben sollte immer her damit ....

                Comment

                Working...
                X