MySQL: Pivot
19. Juni 2009 von Stephan Erdmann [permalink]Mit einem einfachen Trick lassen sich in MySQL Pivot-Statements zaubern, die es ermöglichen, Zeilen in Spalten "umzukonvertieren", also dass die Informationen in der Achse gedreht werden. Hierzu folgt ein einfaches Beispiel.
Ein Shop verkauft genau vier Produkte "Testprodukt 1" – "Testprodukt 4". In einer Tabelle werden die einzelnen vekauften Produkte gespeichert:
CREATE TABLE bestellte_produkte ( id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , kaeufer VARCHAR( 20 ) NOT NULL , produkt VARCHAR( 20 ) NOT NULL , anzahl INT (11) NOT NULL DEFAULT 0 );
Hier einige Testdaten:
INSERT INTO bestellte_produkte (kaeufer,produkt,anzahl) VALUES
('Heinz','Testprodukt 3',1),
('Horst','Testprodukt 1',2),
('Horst','Testprodukt 2',1),
('Horst','Testprodukt 4',1),
('Peter','Testprodukt 2',1),
('Peter','Testprodukt 2',1);
Heinz hat also ein Testprodukt 3 gekauft, Horst 2x das Testprodukt 1 usw. Ein einfaches Select liefert also:
select * from bestellte_produkte; +----+---------+---------------+--------+ | id | kaeufer | produkt | anzahl | +----+---------+---------------+--------+ | 1 | Heinz | Testprodukt 3 | 1 | | 2 | Horst | Testprodukt 1 | 2 | | 3 | Horst | Testprodukt 2 | 1 | | 4 | Horst | Testprodukt 4 | 1 | | 5 | Peter | Testprodukt 2 | 1 | | 6 | Peter | Testprodukt 2 | 1 | +----+---------+---------------+--------+ 6 rows in set (0.00 sec)
Mit Hilfe eines Pivotpunktes wollen wir nun die Verkäufe nach Käufer anzeigen. Für jedes vekaufte Produkt soll eine eigene Spalte erzeugt werden, in der die Gesamtzahl der verkauften Produkte pro Käufer steht. Hierzu nutzen wir ein SUM in Kombination mit einer If -Klausel und gruppieren das Select nach dem Käufer:
SELECT kaeufer, SUM(if(produkt='Testprodukt 1',anzahl,0)) as anzahl_testprodukt_1, SUM(if(produkt='Testprodukt 2',anzahl,0)) as anzahl_testprodukt_2, SUM(if(produkt='Testprodukt 3',anzahl,0)) as anzahl_testprodukt_3, SUM(if(produkt='Testprodukt 4',anzahl,0)) as anzahl_testprodukt_4 FROM bestellte_produkte GROUP BY kaeufer
Das Resultat ist wie folgt:
+---------+----------------------+----------------------+----------------------+----------------------+ | kaeufer | anzahl_testprodukt_1 | anzahl_testprodukt_2 | anzahl_testprodukt_3 | anzahl_testprodukt_4 | +---------+----------------------+----------------------+----------------------+----------------------+ | Heinz | 0 | 0 | 1 | 0 | | Horst | 2 | 1 | 0 | 1 | | Peter | 0 | 2 | 0 | 0 | +---------+----------------------+----------------------+----------------------+----------------------+ 3 rows in set (0.00 sec)
Tags: mysql, pivot
Kategorie: Allgemein, Linux/Unix, Softwareentwicklung
