Kategorien:

Abfragesyntax

UNPIVOT

Rotiert eine Tabelle, indem Spalten in Zeilen verwandelt werden. UNPIVOT ist ein relationaler Operator, der zwei Spalten (aus einer Tabelle oder Unterabfrage) zusammen mit einer Spaltenliste nimmt und für jede in der Liste angegebene Spalte eine Zeile generiert. Bei einer Abfrage wird er in der FROM-Klausel nach dem Tabellennamen oder der Unterabfrage angegeben.

Beachten Sie, dass UNPIVOT nicht das genaue Gegenteil von PIVOT ist, da sich mit PIVOT vorgenommene Aggregationen nicht rückgängig machen lassen.

Mit diesem Operator kann eine breite Tabelle (z. B. empid, jan_sales, feb_sales, mar_sales) in eine schmalere Tabelle (z. B. empid, month, sales) umgewandelt werden.

Siehe auch:

PIVOT

Syntax

SELECT ...
FROM ...
   UNPIVOT ( <value_column>
             FOR <name_column> IN ( <column_list> ) )

[ ... ]
Copy
value_column

Der Name, der der generierten Spalte zugewiesen werden soll, die mit den Werten aus den Spalten in der Spaltenliste aufgefüllt wird.

name_column

Der Name, der der generierten Spalte zugewiesen werden soll, die mit den Namen der Spalten in der Spaltenliste aufgefüllt wird.

column_list

Die Namen der Spalten in der Quelltabelle oder Unterabfrage, die in eine einzige Pivotspalte verschmälert werden. name_column wird mit den Spaltennamen aufgefüllt, value_column mit den Spaltenwerten.

Die column_list darf nur literale Spaltennamen enthalten, keine Unterabfrage.

Beispiele

Entpivotieren Sie bei einer angegebenen Tabelle monthly_sales mit folgender Struktur und folgenden Daten die einzelnen Monatsspalten, um anhand von month einen einzelnen sales-Wert für die jeweiligen Mitarbeiter zurückzugeben:

-- example setup
CREATE OR REPLACE TABLE monthly_sales(empid INT, dept TEXT, jan INT, feb INT, mar INT, april INT);

INSERT INTO monthly_sales VALUES
    (1, 'electronics', 100, 200, 300, 100),
    (2, 'clothes', 100, 300, 150, 200),
    (3, 'cars', 200, 400, 100, 50);

-- UNPIVOT example
SELECT * FROM monthly_sales
    UNPIVOT(sales FOR month IN (jan, feb, mar, april))
    ORDER BY empid;

+-------+-------------+-------+-------+
| EMPID | DEPT        | MONTH | SALES |
|-------+-------------+-------+-------|
|     1 | electronics | JAN   |   100 |
|     1 | electronics | FEB   |   200 |
|     1 | electronics | MAR   |   300 |
|     1 | electronics | APRIL |   100 |
|     2 | clothes     | JAN   |   100 |
|     2 | clothes     | FEB   |   300 |
|     2 | clothes     | MAR   |   150 |
|     2 | clothes     | APRIL |   200 |
|     3 | cars        | JAN   |   200 |
|     3 | cars        | FEB   |   400 |
|     3 | cars        | MAR   |   100 |
|     3 | cars        | APRIL |    50 |
+-------+-------------+-------+-------+
Copy