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.