SELECT ...
FROM <relation>
UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ] (
<value_column> FOR <name_column> IN (<col> [[AS] <alias>] [, ...])
)
[[AS] <alias>]
-- 多值列
UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ] (
(<value_col1>, <value_col2> [, ...]) FOR <name_column>
IN ((<col1>, <col2> [, ...]) [[AS] <alias>] [, ...])
)
参数说明
{ INCLUDE | EXCLUDE } NULLS
{ INCLUDE | EXCLUDE } NULLS
:可选,默认
EXCLUDE NULLS
EXCLUDE NULLS
,即值为 NULL 的行被丢弃(多值列时所有值列都为 NULL 才丢弃)。需要保留 NULL 时写
INCLUDE NULLS
INCLUDE NULLS
。
⚠️ 注意:默认会丢弃 NULL 值行。如果后续要统计“缺失数据”,记得加
INCLUDE NULLS
INCLUDE NULLS
。
<value_column>
<value_column>
:新生成的值列的列名。多值列时写作
(<value_col1>, <value_col2>)
(<value_col1>, <value_col2>)
。
<name_column>
<name_column>
:新生成的名称列的列名,内容是原始列名(或别名)。
IN (...)
IN (...)
:要收拢的原始列。多值列时每组写作
(<col1>, <col2>)
(<col1>, <col2>)
,个数与值列一致。各组的列类型需要兼容。
<alias>
<alias>
:可选,名称列中显示的名字。不写时,单值列显示原始列名;多值列显示用
_
_
连接的原始列名,如
earnings2012_sales2012
earnings2012_sales2012
。
未列在
IN
IN
中的列原样保留,作为每一行的标识列。
使用示例
前置数据:
CREATE OR REPLACE VIEW doc_course_earnings AS SELECT * FROM VALUES
('dotNET', 15000, 48000, 22500),
('Java', 20000, 30000, NULL)
AS t(course, `2012`, `2013`, `2014`);
把三个年份列收拢为
year
year
、
earnings
earnings
两列:
SELECT * FROM doc_course_earnings
UNPIVOT (
earnings FOR year IN (`2012`, `2013`, `2014`)
)
ORDER BY course, year;
course
year
earnings
Java
2012
20000
Java
2013
30000
dotNET
2012
15000
dotNET
2013
48000
dotNET
2014
22500
Java 的
2014
2014
为 NULL,默认被丢弃。保留 NULL 并为名称设置别名:
SELECT * FROM doc_course_earnings
UNPIVOT INCLUDE NULLS (
earnings FOR year IN (`2012` AS y2012, `2013` AS y2013, `2014` AS y2014)
)
WHERE course = 'Java'
ORDER BY year;
course
year
earnings
Java
y2012
20000
Java
y2013
30000
Java
y2014
NULL
多值列:同时收拢每年的收入和销量。前置数据:
CREATE OR REPLACE VIEW doc_course_earnings_sales AS SELECT * FROM VALUES
('dotNET', 15000, NULL, 48000, 1),
('Java', 20000, 1, 30000, 2)
AS t(course, earnings2012, sales2012, earnings2013, sales2013);
SELECT * FROM doc_course_earnings_sales
UNPIVOT (
(earnings, sales) FOR year IN ((earnings2012, sales2012) AS `2012`, (earnings2013, sales2013) AS `2013`)
)
ORDER BY course, year;