カテゴリ:

クエリ構文

PIVOT

入力式の1つの列の一意の値を複数の列に変換し、必要に応じて残りの列の値で結果を集計することにより、テーブルを回転します。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。

演算子は、組み込みの集約関数 AVGCOUNTMAXMIN、 および SUM をサポートします。

PIVOT 幅の狭いテーブル(empidmonthsales など)を幅の広いテーブル(empidjan_salesfeb_salesmar_sales など)に変換するために使用できます。

こちらもご参照ください。

UNPIVOT

構文

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

[ ... ]
Copy
aggregate_function

pivot_column のグループ化された値を結合するための集約関数。

pivot_column

集計されるソーステーブルまたはサブクエリの列。

value_column

列名の生成元となる値を含むソーステーブルまたはサブクエリの列。

pivot_value_N

クエリ結果の見出しにピボットするピボット列の値のリスト。

次の構造を持つテーブル monthly_sales が指定されている場合、指定された月の従業員ごとの合計売上を合計するために amount 列を中心にピボットします。

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

クエリと出力:

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

引用符なしの列名を使用する場合、または出力が入力と異なる列名を使用する場合は、以下に示すように AS 句に列名を含めることができます。

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

または:

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