Bedingte Summenbildung in MySQL
Matthias Apsel
- mysql
- sql
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
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
Hallo Felix Riesterer,
willst Du eine Liste aller Farben mit ihrer jeweiligen Seitenzahl?
Dies.
Bis demnächst
Matthias
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
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
so schräg, dass es umfällt ↩︎
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
Tach!
in einer Tabelle gibt es die Spalten
Papierfarbe
(PF) undDruckseiten
(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.
Hallo dedlfix,
Gruppieren über Papierfarben?
Das scheint zielführend zu sein.
Bis demnächst
Matthias
Hey,
versuche es mal damit:
SELECT SUM(DS) AS Summe_DS_weiß
FROM table
GROUP BY PF
HAVING PF = 'weiss';
Viele Grüße
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.
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
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
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.
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.
Hallo A. Nonym,
Das Gesamtproblem ist komplexer als ich es hier darstellen kann. Deshalb waren die Antworten wertvolle Denkanstöße.
Bis demnächst
Matthias
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
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