カテゴリ:

クエリ構文

UNPIVOT

列を行に変換することにより、テーブルを回転します。UNPIVOT は、列のリストとともに(テーブルまたはサブクエリから)2つの列を受け入れ、リストで指定された各列の行を生成する関係演算子です。クエリでは、テーブル名またはサブクエリの後の FROM 句で指定されます。

PIVOT によって行われた集約を取り消すことができないため、 UNPIVOT は PIVOT の完全に逆ではないことに注意してください。

この演算子を使用して、幅の広いテーブル(例: empidjan_salesfeb_salesmar_sales など)を幅の狭いテーブル(例: empidmonthsales)に変換できます。

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

PIVOT

構文

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

[ ... ]
値列

生成列に割り当てる名前。列リスト内の列の値が入力されます。

名前列

生成列に割り当てる名前。列リスト内の列の名前が入力されます。

列リスト

単一のピボット列に絞り込まれるソーステーブルまたはサブクエリの列の名前。列名には 名前列 が入力され、列値には 値列 が入力されます。

列リスト には、サブクエリではなくリテラル列名のみを含める必要があります。

次の構造とデータを持つテーブル monthly_sales を使用して、個々の月列のピボットを解除し、各従業員に対して month ごとに単一の sales 値を返します。

-- 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 |
+-------+-------------+-------+-------+