カテゴリ:

クエリ構文

UNPIVOT

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

PIVOT による集計は取り消すことができないため、 UNPIVOT は PIVOT の真逆ではありません。

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

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

PIVOT

構文

SELECT ...
FROM ...
    UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ]
      ( <value_column>
        FOR <name_column> IN ( <column_list> ) )

[ ... ]
Copy

パラメーター

{ INCLUDE | EXCLUDE } NULLS

name_column に NULLs のある行を含めるか除外するかを指定します。

  • INCLUDE NULLS の場合は、 NULLs のある行が含まれます。

  • EXCLUDE NULLS の場合は、 NULLs のある行が除外されます。

デフォルト: EXCLUDE NULLS

value_column

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

name_column

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

column_list

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

column_list にはリテラル列名のみを含めることができ、サブクエリを含めることはできません。

以下の構造とデータを持つテーブル、 monthly_sales を作成します。

CREATE OR REPLACE TABLE monthly_sales(
  empid INT,
  dept TEXT,
  jan INT,
  feb INT,
  mar INT,
  apr INT
);

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

SELECT * FROM monthly_sales;
Copy
+-------+-------------+-----+------+------+-----+
| EMPID | DEPT        | JAN | FEB  | MAR  | APR |
|-------+-------------+-----+------+------+-----|
|     1 | electronics | 100 | 200  | 300  | 100 |
|     2 | clothes     | 100 | 300  | 150  | 200 |
|     3 | cars        | 200 | 400  | 100  |  50 |
|     4 | appliances  | 100 | NULL | 100  |  50 |
+-------+-------------+-----+------+------+-----+

個々の月列のピボットを解除し、各従業員に対して month ごとに単一の sales 値を返します。

SELECT *
  FROM monthly_sales
    UNPIVOT (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY empid;
Copy
+-------+-------------+-------+-------+
| EMPID | DEPT        | MONTH | SALES |
|-------+-------------+-------+-------|
|     1 | electronics | JAN   |   100 |
|     1 | electronics | FEB   |   200 |
|     1 | electronics | MAR   |   300 |
|     1 | electronics | APR   |   100 |
|     2 | clothes     | JAN   |   100 |
|     2 | clothes     | FEB   |   300 |
|     2 | clothes     | MAR   |   150 |
|     2 | clothes     | APR   |   200 |
|     3 | cars        | JAN   |   200 |
|     3 | cars        | FEB   |   400 |
|     3 | cars        | MAR   |   100 |
|     3 | cars        | APR   |    50 |
|     4 | appliances  | JAN   |   100 |
|     4 | appliances  | MAR   |   100 |
|     4 | appliances  | APR   |    50 |
+-------+-------------+-------+-------+

前の SELECT ステートメントは、デフォルトで NULLs を除外します。そのため、2月の家電製品の行は結果に含まれていません。結果に NULLs を含めるには、以下の SQL ステートメントを実行します。

SELECT *
  FROM monthly_sales
    UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY empid;
Copy
+-------+-------------+-------+-------+
| EMPID | DEPT        | MONTH | SALES |
|-------+-------------+-------+-------|
|     1 | electronics | JAN   |   100 |
|     1 | electronics | FEB   |   200 |
|     1 | electronics | MAR   |   300 |
|     1 | electronics | APR   |   100 |
|     2 | clothes     | JAN   |   100 |
|     2 | clothes     | FEB   |   300 |
|     2 | clothes     | MAR   |   150 |
|     2 | clothes     | APR   |   200 |
|     3 | cars        | JAN   |   200 |
|     3 | cars        | FEB   |   400 |
|     3 | cars        | MAR   |   100 |
|     3 | cars        | APR   |    50 |
|     4 | appliances  | JAN   |   100 |
|     4 | appliances  | FEB   |  NULL |
|     4 | appliances  | MAR   |   100 |
|     4 | appliances  | APR   |    50 |
+-------+-------------+-------+-------+

この出力には、2月の家電製品の行が含まれています。

すべての列を * で選択するのではなく、特定の列を SELECT リストに含めて、 UNPIVOT value_columnname_column を参照することができます。次の例は前の例と似ていますが、 SELECT リストで value_column salesname_column month を指定しています。このクエリは empid 列を除外しています。

SELECT dept, month, sales
  FROM monthly_sales
    UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY dept;
Copy
+-------------+-------+-------+
| DEPT        | MONTH | SALES |
|-------------+-------+-------|
| appliances  | JAN   |   100 |
| appliances  | FEB   |  NULL |
| appliances  | MAR   |   100 |
| appliances  | APR   |    50 |
| cars        | JAN   |   200 |
| cars        | FEB   |   400 |
| cars        | MAR   |   100 |
| cars        | APR   |    50 |
| clothes     | JAN   |   100 |
| clothes     | FEB   |   300 |
| clothes     | MAR   |   150 |
| clothes     | APR   |   200 |
| electronics | JAN   |   100 |
| electronics | FEB   |   200 |
| electronics | MAR   |   300 |
| electronics | APR   |   100 |
+-------------+-------+-------+