- 类别:
UNPIVOT¶
通过将列转换为行来旋转表。UNPIVOT 是一个关系运算符,它接受两列(来自表或子查询)以及列的列表,并为列表中指定的每列生成一行。在查询中,它在表名或子查询后面的 FROM 子句中指定。
UNPIVOT is not exactly the reverse of PIVOT because it can't undo aggregations made by PIVOT.
此运算符可用于将宽表(例如 empid、jan_sales、feb_sales、mar_sales)转换为较窄的表(例如 empid、month、sales)。
- 另请参阅:
语法¶
参数¶
{ INCLUDE | EXCLUDE } NULLS指定包含还是排除
name_column中为 NULLs 的行:INCLUDE NULLS包含为 NULLs 的行。EXCLUDE NULLS不包含为 NULLs 的行。
默认:
EXCLUDE NULLSvalue_column要分配给生成的列的名称,该列将使用列的列表中各列的值进行填充。
name_column要分配给生成的列的名称,该列将使用列的列表中的列名称进行填充。
column_list源表或子查询中将轮换为单个透视列的列的名称。列名称将填充
name_column,列值将填充value_column。column_list仅可包含字面量列名称,不能包含子查询。column_list中的列必须具有完全相同的数据类型,但以下情况除外:文本字符串的数据类型 长度可以不同。
如果列包含文本字符串,则不同的列可以使用不同的文本数据类型。例如,该列表可以包括一个 VARCHAR 列和一个 CHAR 列。
[ AS ] col_alias指定要在 UNPIVOT 操作的结果中使用的列别名,而不是原始列名。不能对同一列名使用不同的别名。但是,不能对多个列名使用相同的别名。AS 关键字是可选的。
Usage notes¶
You can't use a LATERAL join to directly reference the result set of an UNPIVOT operation. Attempting to do so returns an error. As a workaround, materialize the UNPIVOT result into a temporary table first, then reference that table in the LATERAL join. To create and load the
monthly_salestable that is selected from in this example, see the examples section.The following query doesn't work because LATERAL can't reference an UNPIVOT result set directly:
The following CREATE TEMPORARY TABLE statement creates a temporary table to materialize the UNPIVOT result. The query that follows that statement references the temporary table in the LATERAL join:
示例¶
创建一个名为 monthly_sales 的表,其结构和数据如下:
取消透视各个月份列,以按 month 为每个雇员返回单独一个 sales 值:
以下示例与前面的示例相同,但它使用列名的别名:
上一个 SELECT 语句默认排除 NULLs。因此,结果中不包括针对 2 月份的家电数据的行。要在结果中包含 NULLs,请运行以下 SQL 语句:
该输出包含 2 月份的家电数据行。
无需使用 * 选择所有列,您可以在 SELECT 列表中包含特定列,并引用 UNPIVOT value_column 和 name_column。下面的示例与前面的示例类似,但在 SELECT 列表中指定了 value_column sales 和 name_column month。查询不包含 empid 列: