- カテゴリ:
PIVOT¶
入力式の1つの列の一意の値を複数の列に変換し、必要に応じて残りの列の値で結果を集計することにより、テーブルを回転します。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。
演算子は、組み込みの集約関数 AVG、 COUNT、 MAX 、 MIN、 および SUM をサポートします。
PIVOT 幅の狭いテーブル(empid
、 month
、 sales
など)を幅の広いテーブル(empid
、 jan_sales
、 feb_sales
、 mar_sales
など)に変換するために使用できます。
- こちらもご参照ください。
構文¶
SELECT ...
FROM ...
PIVOT ( <aggregate_function> ( <pivot_column> )
FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )
[ ... ]
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');クエリと出力:
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 | +-------+-------+-------+-------+-------+
引用符なしの列名を使用する場合、または出力が入力と異なる列名を使用する場合は、以下に示すように 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 | +----------------+-------+-------+-------+-------+
または:
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 | +--------+---------+----------+-------+-------+