- 类别:
UNPIVOT¶
通过将列转换为行来旋转表。UNPIVOT 是一个关系运算符,它接受两列(来自表或子查询)以及列的列表,并为列表中指定的每列生成一行。在查询中,它在表名或子查询后面的 FROM 子句中指定。
请注意,UNPIVOT 与 PIVOT 并不完全相反,因为它无法撤消 PIVOT 生成的聚合。
此运算符可用于将宽表(例如 empid
、jan_sales
、feb_sales
、mar_sales
)转换为较窄的表(例如 empid
、month
、sales
)。
- 另请参阅:
语法¶
SELECT ...
FROM ...
UNPIVOT ( <value_column>
FOR <name_column> IN ( <column_list> ) )
[ ... ]
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 | +-------+-------------+-------+-------+