SQL UNPIVOT ist das Gegenstück zu PIVOT: Es verwandelt Spalten in Zeilen. Aus einer breiten Tabelle mit einer Spalte je Monat wird wieder eine lange Liste mit einer Zeile je Monat – die Normalisierung von Berichtsdaten für die Weiterverarbeitung.
Das Grundprinzip
Eine Tabelle speichert Umsätze je Quartal in eigenen Spalten:
SELECT * FROM umsatz_quartal;
-- q1 | q2 | q3
-- 120 | 90 | 150
UNPIVOT bringt die Quartale in eine Zeile je Wert:
SELECT *
FROM umsatz_quartal
UNPIVOT (umsatz FOR quartal IN (q1, q2, q3)) AS u;
umsatz: die neue Wertespalte (hier die Zahlen)quartal: die neue Namensspalte (hier q1, q2, q3)IN (q1, q2, q3): die umzuwandelnden Quellspalten
Verbreitung
Wie PIVOT ist UNPIVOT ein nativer Operator von SQL Server (seit 2005) und Oracle (seit 11g). PostgreSQL erreicht denselben Effekt über UNION ALL mit je einem SELECT pro Spalte oder mit LATERAL-Subqueries (siehe SQL LATERAL). MySQL und MariaDB kennen keinen UNPIVOT-Operator – auch dort hilft UNION ALL.
Warum UNPIVOT?
- Berichtstabellen sind oft breit, Analysen brauchen aber lange, schlanke Daten.
- Viele Aggregatfunktionen und GROUP BY-Auswertungen arbeiten zeilenorientiert.
- Normalisierte Daten sind leichter filterbar:
WHERE quartal = 'q1'statt drei Spalten zu prüfen.
Wer die breiten Quelldaten erst aus mehreren Systemen zusammenführt, nutzt dafür oft SQL MERGE – es gleicht die geladenen Staging-Daten mit der Zieltabelle ab, bevor UNPIVOT sie in die lange Form bringt.
Hinweis: UNPIVOT entfernt standardmäßig NULL-Werte – Zeilen, in denen die Quellspalte NULL ist, erscheinen nicht im Ergebnis. Wer NULL-Zeilen behalten will, braucht in SQL Server die Option INCLUDE NULLS.