Kategorien:

Abfragesyntax

PIVOT

Rotiert eine Tabelle, indem die eindeutigen Werte aus einer Spalte im Eingabeausdruck in mehrere Spalten verwandelt und Ergebnisse bei Bedarf für alle verbleibenden Spaltenwerte aggregiert werden. Bei einer Abfrage wird er in der FROM-Klausel nach dem Tabellennamen oder der Unterabfrage angegeben.

Der Operator unterstützt die integrierten Aggregatfunktionen AVG, COUNT, MAX, MIN und SUM.

PIVOT kann dazu dienen, eine schmale Tabelle (z. B. empid, month, sales) in eine breitere Tabelle zu verwandeln (z. B. empid, jan_sales, feb_sales, mar_sales).

Siehe auch:

UNPIVOT

Syntax

SELECT ...
FROM ...
   PIVOT ( <aggregate_function> ( <pivot_column> )
            FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )

[ ... ]
Copy
aggregate_function

Die Aggregatfunktion zum Zusammenfassen der gruppierten Werte aus pivot_column.

pivot_column

Die Spalte aus der Quelltabelle oder Unterabfrage, die aggregiert wird.

value_column

Die Spalte aus der Quelltabelle oder Unterabfrage, die die Werte enthält, aus denen Spaltennamen generiert werden.

pivot_value_N

Eine Liste von Werten für die Pivotspalte, die in den Abfrageergebnissen in Überschriften pivotiert werden.

Beispiele

Bei einer Tabelle monthly_sales mit der folgenden Struktur pivotieren Sie um die Spalte amount, um den Gesamtumsatz pro Mitarbeiter für die angegebenen Monate zu summieren:

CREATE OR REPLACE TABLE monthly_sales(empid INT, amount INT, month TEXT)
    AS SELECT * FROM VALUES
    (1, 10000, 'JAN'),
    (1, 400, 'JAN'),
    (2, 4500, 'JAN'),
    (2, 35000, 'JAN'),
    (1, 5000, 'FEB'),
    (1, 3000, 'FEB'),
    (2, 200, 'FEB'),
    (2, 90500, 'FEB'),
    (1, 6000, 'MAR'),
    (1, 5000, 'MAR'),
    (2, 2500, 'MAR'),
    (2, 9500, 'MAR'),
    (1, 8000, 'APR'),
    (1, 10000, 'APR'),
    (2, 800, 'APR'),
    (2, 4500, 'APR');
Copy

Abfrage und Ausgabe:

SELECT * 
  FROM monthly_sales
    PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR'))
      AS p
  ORDER BY EMPID;
+-------+-------+-------+-------+-------+
| EMPID | 'JAN' | 'FEB' | 'MAR' | 'APR' |
|-------+-------+-------+-------+-------|
|     1 | 10400 |  8000 | 11000 | 18000 |
|     2 | 39500 | 90700 | 12000 |  5300 |
+-------+-------+-------+-------+-------+
Copy

Wenn Sie die Spaltennamen ohne Anführungszeichen bevorzugen oder wünschen, dass die Ausgabe andere Spaltennamen hat als die Eingabe, können Sie die Spaltennamen in die AS-Klausel einschließen, wie unten dargestellt:

SELECT * 
  FROM monthly_sales
    PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR'))
      AS p (EMP_ID_renamed, JAN, FEB, MAR, APR)
  ORDER BY EMP_ID_renamed;
+----------------+-------+-------+-------+-------+
| EMP_ID_RENAMED |   JAN |   FEB |   MAR |   APR |
|----------------+-------+-------+-------+-------|
|              1 | 10400 |  8000 | 11000 | 18000 |
|              2 | 39500 | 90700 | 12000 |  5300 |
+----------------+-------+-------+-------+-------+
Copy

oder:

SELECT EMPID AS EMP_ID, "'JAN'" AS JANUARY, "'FEB'" AS FEBRUARY, "'MAR'" AS MARCH,
    "'APR'" AS APRIL
  FROM monthly_sales
    PIVOT(sum(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) 
      AS p
  ORDER BY EMPID;
+--------+---------+----------+-------+-------+
| EMP_ID | JANUARY | FEBRUARY | MARCH | APRIL |
|--------+---------+----------+-------+-------|
|      1 |   10400 |     8000 | 11000 | 18000 |
|      2 |   39500 |    90700 | 12000 |  5300 |
+--------+---------+----------+-------+-------+
Copy