Matthias Apsel: Bedingte Summenbildung in MySQL

Hallo alle,

in einer Tabelle gibt es die Spalten Papierfarbe (PF) und Druckseiten (DS) und. Ich brauche die Summen der Druckseiten je Papierfarbe. Die Abkürzungen dienen nur dazu, die Abfragen in eine Zeile zu bekommen.

SELECT SUM(DS) as Summe_DS FROM table
SELECT if(PF = 'weiß', SUM(DS) as Summe_DS_weiß) FROM table
SELECT if(PF = 'weiß', SUM(DS)) as Summe_DS_weiß FROM table

Wie kann ich das umsetzen?

Bis demnächst
Matthias

--
Pantoffeltierchen haben keine Hobbys.
¯\_(ツ)_/¯
  1. Lieber Matthias,

    willst Du eine Liste aller Farben mit ihrer jeweiligen Seitenzahl?
    Oder willst Du die Seitenzahl von nur einer bestimmten Farbe?

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix Riesterer,

      willst Du eine Liste aller Farben mit ihrer jeweiligen Seitenzahl?

      Dies.

      Bis demnächst
      Matthias

      --
      Pantoffeltierchen haben keine Hobbys.
      ¯\_(ツ)_/¯
      1. Lieber Matthias,

        willst Du eine Liste aller Farben mit ihrer jeweiligen Seitenzahl?

        Dies.

        dann wird das etwas in dieser Art werden:

        SELECT
          `color` AS `Papierfarbe`,
          (
            SELECT SUM(`page`)
            FROM DS
            WHERE DS.`page` = PF.`page`
          ) AS `Seitenzahl
        FROM PF
        

        Liebe Grüße

        Felix Riesterer

        1. Hallo Felix,

          in einer Tabelle gibt es die Spalten Papierfarbe (PF) und Druckseiten (DS)

          Mein Fettsatz, mein Minus wegen Thema verfehlt und horizontalem[1] SQL.

          PF und DS sind Spalten, nicht Tabellen, die Spalte page hast Du frei erfunden, und du verwendest sie gleichzeitig als Fremdschlüssel und als irgendwas Summiertes. Entweder bin ich zu blöd, dein Genie zu verstehen, oder dein Genie ist knapp hinter der Grenze zum Wahnsinn gelandet 😉

          Rolf

          --
          sumpsi - posui - clusi

          1. so schräg, dass es umfällt ↩︎

          1. Lieber Rolf,

            PF und DS sind Spalten, nicht Tabellen

            aha, das war mir nicht sofort klar geworden. Das macht meinen Vorschlag natürlich absolut wertlos.

            Liebe Grüße

            Felix Riesterer

  2. Tach!

    in einer Tabelle gibt es die Spalten Papierfarbe (PF) und Druckseiten (DS) und. Ich brauche die Summen der Druckseiten je Papierfarbe.

    Gruppieren über Papierfarben? Auf Gruppen jedenfalls kann man Aggregatfunktionen (wie SUM) anwenden. Wenn es nur bestimmte Farben sein sollen, dann im WHERE einschränken.

    dedlfix.

    1. Hallo dedlfix,

      Gruppieren über Papierfarben?

      Das scheint zielführend zu sein.

      Bis demnächst
      Matthias

      --
      Pantoffeltierchen haben keine Hobbys.
      ¯\_(ツ)_/¯
  3. Hey,

    versuche es mal damit:

    SELECT SUM(DS) AS Summe_DS_weiß
    FROM table
    GROUP BY PF
    HAVING PF = 'weiss';
    

    Viele Grüße

    1. Tach!

      SELECT SUM(DS) AS Summe_DS_weiß
      FROM table
      GROUP BY PF
      HAVING PF = 'weiss';
      

      HAVING braucht man hier nicht, sondern WHERE. HAVING kommt zur Anwendung, wenn das Ergebnis bereits berechnet wurde und noch weiter gefiltert werden soll. WHERE hingegen wird viel früher angewendet und filtert gleich auf Datensatzebene.

      dedlfix.

  4. Hallo Matthias,

    es kommt darauf an, welches Ergebnis Du willst.

    Dies:

    Farbe  Anzahl
    Rot    7
    Grün   6
    Blau   2
    

    Oder dies:

    Rot   Gruen  Blau
    7     6      2
    

    Ersteres ist ein GROUP BY

    SELECT Papierfarbe, SUM(Druckseiten)
    FROM table
    GROUP BY Papierfarbe
    

    Zweiteres ein PIVOT, der sich in MYSQL nur mit Workaround lösen lässt.

    SELECT SUM(Case PF WHEN 'Rot'  THEN DS ELSE 0 END CASE) as Rot, 
           SUM(Case PF WHEN 'Grün' THEN DS ELSE 0 END CASE) as Gruen,
           SUM(Case PF WHEN 'Blau' THEN DS ELSE 0 END CASE) as Blau 
    FROM table
    

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf B,

      Dies:

      Farbe  Anzahl
      Rot    7
      Grün   6
      Blau   2
      

      Oder dies:

      Rot   Gruen  Blau
      7     6      2
      

      Erst habe ich gedacht: "Mir doch egal", aber in der Weiterverarbeitung scheint mir die zweite Variante einfacher zu sein.

      SELECT SUM(Case PF WHEN 'Rot'  THEN DS ELSE 0 END CASE) as Rot, 
             SUM(Case PF WHEN 'Grün' THEN DS ELSE 0 END CASE) as Gruen,
             SUM(Case PF WHEN 'Blau' THEN DS ELSE 0 END CASE) as Blau 
      FROM table
      

      Dankeschön.

      Bis demnächst
      Matthias

      --
      Pantoffeltierchen haben keine Hobbys.
      ¯\_(ツ)_/¯
      1. Erst habe ich gedacht: "Mir doch egal", aber in der Weiterverarbeitung scheint mir die zweite Variante einfacher zu sein.

        "scheint"! Ein Eindruck kann täuschen. Denn entweder stehen in deinem Programm Daten oder du brauchst zuvor einen weiteren Schritt um aus einer Liste mit Farben die Abfrage zu bauen.

        1. Du bekommst also womöglich Probleme, wennneue Farben hinzukommen. Insoweit würde Ich dir zur Lösung von Dedlfix raten.

          Tabelle:

          +-------+------+-------------+
          | PF    | DS   | DOKUMENT_ID |
          +-------+------+-------------+
          | Gelb  |    3 |           1 |
          | Gruen |    2 |           1 |
          | Blau  |    2 |           1 |
          | Gelb  |    4 |           1 |
          | Gelb  |    1 |           2 |
          | Rot   |    7 |           2 |
          +-------+------+-------------+
          

          (Die Farben sollten aber in einer weiteren Tabelle stehen. Ich nehme mal an, das weißt Du selbst.)

          Abfrage:

          select PF, sum(DS) as AZ from papers where DOKUMENT_ID=2 group by PF;
          

          Ergebnis:

          +------+------+
          | PF   | AZ   |
          +------+------+
          | Gelb |    1 |
          | Rot  |    7 |
          +------+------+
          

          Abfrage:

          select PF, sum(DS) as AZ from papers where DOKUMENT_ID=1 group by PF;
          

          Ergebnis:

          +-------+------+
          | PF    | AZ   |
          +-------+------+
          | Blau  |    2 |
          | Gelb  |    7 |
          | Gruen |    2 |
          +-------+------+
          

          Abfrage:

          select PF, sum(DS) as AZ from papers group by PF;
          

          Ergebnis:

          +-------+------+
          | PF    | AZ   |
          +-------+------+
          | Blau  |    2 |
          | Gelb  |    8 |
          | Gruen |    2 |
          | Rot   |    7 |
          +-------+------+
          

          Weiterverarbeitung:

          Wenn Du über die Ausgaben iterierts, dann sammle die Daten einfach in einem Array mit den Farben als Keys.

        2. Hallo A. Nonym,

          Das Gesamtproblem ist komplexer als ich es hier darstellen kann. Deshalb waren die Antworten wertvolle Denkanstöße.

          Bis demnächst
          Matthias

          --
          Pantoffeltierchen haben keine Hobbys.
          ¯\_(ツ)_/¯
    2. Hallo Rolf B,

      SELECT SUM(Case PF WHEN 'Rot'  THEN DS ELSE 0 END CASE) as Rot, 
             SUM(Case PF WHEN 'Grün' THEN DS ELSE 0 END CASE) as Gruen,
             SUM(Case PF WHEN 'Blau' THEN DS ELSE 0 END CASE) as Blau 
      FROM table
      

      Die MySQL-Syntax sieht kein schließendes CASE vor. Also so:

      SELECT SUM(Case PF WHEN 'Rot'  THEN DS ELSE 0 END) as Rot, 
             SUM(Case PF WHEN 'Grün' THEN DS ELSE 0 END) as Gruen,
             SUM(Case PF WHEN 'Blau' THEN DS ELSE 0 END) as Blau 
      FROM table
      

      Bis demnächst
      Matthias

      --
      Pantoffeltierchen haben keine Hobbys.
      ¯\_(ツ)_/¯
      1. Hallo Matthias,

        ah, Mist, CASE Statement und CASE Expression verwechselt. In T-SQL (MS SQL Server) gibt's kein CASE Statement, darum war ich gar nicht auf die Idee gekommen, auf der falschen Seite gelandet zu sein.

        Gerade auch noch gefunden für CASE mit einem WHEN:

        SELECT SUM(IF(PF='Rot', DS, 0)) as Rot, ...
        

        Hoffentlich ist das jetzt richtig, in T-SQL wäre es IIF, und Norm-SQL ist beides scheinbar nicht (da gibt's nur die case_expression).

        Rolf

        --
        sumpsi - posui - clusi