SQL PIVOT dreht eine Ergebnismenge: Werte aus Zeilen werden zu Spalten. Aus einer langen Liste mit einer Zeile je Monat und Umsatz wird so eine breite Übersicht mit einer Spalte je Monat – ideal für Berichte und Vergleichstabellen.
Das Grundprinzip
Ohne Pivot liefert eine Abfrage viele Zeilen:
SELECT monat, SUM(umsatz) FROM verkauf GROUP BY monat;
Mit Pivot erscheint jeder Monat als eigene Spalte:
SELECT *
FROM (SELECT jahr, monat, umsatz FROM verkauf) AS q
PIVOT (SUM(umsatz) FOR monat IN (1, 2, 3)) AS p;
- Die Aggregatfunktion (hier
SUM) bestimmt den Zellenwert. FOR monat IN (...)legt fest, welche Werte zu Spalten werden.- Die Spaltenliste ist fest – dynamische Werte erfordern dynamisches SQL.
Verbreitung und Alternativen
Einen nativen PIVOT-Operator bieten SQL Server (seit 2005) und Oracle (seit 11g). PostgreSQL nutzt die crosstab()-Funktion aus dem Zusatzpaket tablefunc. MySQL und MariaDB haben keinen PIVOT-Operator – dort kombiniert man CASE mit einer Aggregatfunktion:
SELECT jahr,
SUM(CASE WHEN monat = 1 THEN umsatz END) AS januar,
SUM(CASE WHEN monat = 2 THEN umsatz END) AS februar
FROM verkauf GROUP BY jahr;
Diese Technik ist in SQL CASE ausführlich beschrieben. Zusammen mit GROUP BY und Aggregatfunktionen lassen sich so auch ohne PIVOT-Operator Pivot-Tabellen bauen. Zum Laden der Quelldaten kommt häufig SQL MERGE zum Einsatz, das Staging-Tabellen mit der Zieltabelle abgleicht.
Einsatz
Pivot-Abfragen sind in der OLAP-Berichterstattung und im Data-Warehouse-Umfeld verbreitet, wo Kennzahlen je Zeitraum oder Region nebeneinander stehen sollen. Das Gegenstück, das Spalten wieder in Zeilen verwandelt, ist UNPIVOT.