Ankündigung

Einklappen
Keine Ankündigung bisher.

Bei SUM()-Abfrage auch Einträge ohne Betrag ausgeben...

Einklappen

Neue Werbung 2019

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

  • Bei SUM()-Abfrage auch Einträge ohne Betrag ausgeben...

    Nabend zusammen,

    ich habe folgende MySQL-Abfrage, mit der ich die Beträge von verschiedenen Kategorien zusammenzählen und ausgeben lasse.

    PHP-Code:
    $mysqli_abfrage "SELECT
                                SUM(verkauf.verkauf_betrag) AS ausgaben_gesamt,
                                verkauf.verkauf_kategorien_id,
                                verkauf_kategorien.verkauf_kategorien_id,
                                verkauf_kategorien.verkauf_kategorien_name
                            FROM
                                verkauf
                            INNER JOIN verkauf_kategorien ON verkauf.verkauf_kategorien_id = verkauf_kategorien.verkauf_kategorien_id
                            WHERE
                                YEAR(verkauf_datum)= ? AND MONTH(verkauf_datum) = ?
                            GROUP BY
                                verkauf_kategorien.verkauf_kategorien_name
                            ORDER BY
                                verkauf.verkauf_kategorien_name"
    ;

                            if(
    $mysqli_ergebnis $mysqli_verbindung->execute_query($mysqli_abfrage, [$zeitraum[0], $zeitraum[1]]))
                            {
                              
    AUSGABE
                           

    Das funktioniert generell sehr gut. Die Sache ist nur die, dass dabei natürlich nur die Kategorien aufgeführt werden, denen schon Beträge zugewiesen wurden. Damit ich die Auflistung aber in verschiedenen Zeiträumen miteinander vergleichen kann, müsste ich natürlich auch die restlichen Kategorien ausgeben, dann eben mit 0,00 als Betrag - die eine Kategorie kann nur in dem einen Monat, die andere in einem anderen Monat auftauchen.

    Mein Ansatz wäre jetzt von der Tabelle verkauf_kategorien auszugehen und mit der ID alle Einträge in verkauf zusammenzurechnen - also genau anders herum wie jetzt. Eine andere Idee wäre mit zwei Abfragen zu arbeiten: Die eine ermittelt den Namen und die ID der Kategorie, die andere sucht anhand der Kategorie_ID in den Kategorien nach entsprechenden Einträgen...wenn die Abfrage keine Einträge ermittelt wird 0,00 Euro ausgegeben.

    Wären das denkbare Ansätze? Oder gibt es da eine elegantere oder vielleicht sogar einfachere Lösung?

    Besten dank schon mal

    Lapje

  • #2
    Zitat von Lapje Beitrag anzeigen
    Die Sache ist nur die, dass dabei natürlich nur die Kategorien aufgeführt werden, denen schon Beträge zugewiesen wurden.
    Das ist generell so, by design. SQL wertet vorhandene Daten aus, es gibt keine Idee davon, was mit nicht vorhandenen Daten geschehen soll.

    Die Lösung ist generell, die nicht vorhandenen Daten hinzuzufügen.
    Das bedeutet, die Basisabfrage, die später mit Gruppenaggregaten abgefragt wird, muss per Join um alle Kategorien (in diesem Fall ergänzt werden).

    etwa: select id, name from kategorie k
    wird die Basisabfrage, diese wird per Outer Join mit den Produktivdaten verknüpft

    also: select id, name from kategorie k left join (select * from produktivdaten) p on k.id = p.kategorie_id

    Werden im späteren Ergebnis auch Aufschlüsselungen nach Monat, Jahr oder weiteren Merkmalen benötigt, so müssen diese auf die gleiche Weise appliziert werden.

    P.S.: Die Aufsummierung der Kategorien muss dann natürlich anhand der vorhandenen, befüllten Kategorienspalte (k.name) erfolgen, nicht über die ggf. leere Spalte der Produktivdaten.

    Kommentar

    Lädt...
    X