In einer Tabelle sind für zwei fest definierte Kategorien A und B die jeweilige Anzahl zu den Ereignissen x und y wie folgt gegeben:
x y category count
---------------------
1 2 A 10
1 2 B 20
1 3 A 100
1 3 B 200
1 4 A 1000
1 5 B 2000
Nun muss die Struktur zur Auswertung dahingehend geändert werden, dass die Kategorien A und B als Spalten und die jeweilige Anzahl als Wert in den Zeilen, gruppiert nach x und y, bereitstehen. Dazu müssen die Zeilen als Spalten ausgegeben und die jeweils zur Kategorie passende Anzahl, unter Berücksichtigung der Ereignisse, als Wert in diese Spalte geschrieben werden. Auch müssen bisher nicht definierte Anzahlen auf 0 gesetzt werden, sodass das Resultat folgendermaßen aussieht:
x y A B
----------------
1 2 10 20
1 3 100 200
1 4 1000 0
1 5 0 2000
Erreicht werden kann das mit dieser Abfrage:
SELECT
`x`, `y`,
SUM(IF(`category` = "A", `count`, 0)) `A`,
SUM(IF(`category` = "B", `count`, 0)) `B`
FROM `Test`
GROUP BY `x`, `y`
Hierbei wird das Ergebnis nach den Ereignissen x und y gruppiert und dabei für beide Kategorien die entsprechende Summe der Anzahl gebildet.
Das Problem dabei ist jedoch die Beschränkung auf eine vorgegebene Menge von Kategorien. Eine Lösung für variable Werte wäre interessant, lässt sich allerdings (wahrscheinlich) aufgrund der unklaren Anzahl resultierender Spalten nicht allein in SQL realisieren.
Für alle, die damit selbst ein wenig spielen möchten, hier die Anweisungen zum Erzeugen und Füllen der Test-Tabelle:
CREATE TABLE `Test` (
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
`category` enum('A','B') NOT NULL,
`count` int(11) NOT NULL
);
INSERT `Test` (`x`, `y`, `category`, `count`) VALUES
(1, 2, 'A', 10),
(1, 2, 'B', 20),
(1, 3, 'A', 100),
(1, 3, 'B', 200),
(1, 4, 'A', 1000),
(1, 5, 'B', 2000);