类别:

查询语法

UNPIVOT

通过将列转换为行来旋转表。UNPIVOT 是一个关系运算符,它接受两列(来自表或子查询)以及列的列表,并为列表中指定的每列生成一行。在查询中,它在表名或子查询后面的 FROM 子句中指定。

请注意,UNPIVOT 与 PIVOT 并不完全相反,因为它无法撤消 PIVOT 生成的聚合。

此运算符可用于将宽表(例如 empidjan_salesfeb_salesmar_sales)转换为较窄的表(例如 empidmonthsales)。

另请参阅:

PIVOT

语法

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

[ ... ]
Copy
value_column

要分配给生成的列的名称,该列将使用列的列表中各列的值进行填充。

name_column

要分配给生成的列的名称,该列将使用列的列表中的列名称进行填充。

column_list

源表或子查询中将缩小为单个数据透视列的列的名称。列名称将填充 name_column,列值将填充 value_column

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 |
+-------+-------------+-------+-------+
Copy
语言: 中文