至少早在 v16.1 中就已经添加了 Pivot 功能:
https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/GnnbigJTnAWrDfLbecAN7Q
为此答案提供一些示例。
v16.2 和更高版本允许您从数据透视表中的表中选择不同的值,而在 16.1 中,您需要指定要透视的字段。下面提供了两个示例。
DDL 创建示例表:
Create table tbl(id varchar(3), typ varchar(2), val smallint);
insert into tbl ('aaa', '1a', 10);
insert into tbl ('aaa', '1b', 20);
insert into tbl ('aaa', '1c', 7);
insert into tbl ('bbb', '2a', 10);
insert into tbl ('bbb', '1a', 5);
在 16.1 中,您必须指定要转置的字段(注意双引号将类型名称转换为有效的列名称):
Select *
from tbl pivot (sum(val)
for typ in ('1a' as "1a" ,'1b' as "1b",'1c' as "1c",'2a' as "2a" )
) tmp
16.2 更灵活一些,无需显式指定数据透视字段:
SELECT *
from tbl pivot (sum(val)
for typ in (Select distinct typ from tbl)
) tmp
order by 1
两个结果是一样的:
| id |
1a |
1b |
1c |
2a |
| aaa |
10 |
20 |
7 |
NULL |
| bbb |
5 |
NULL |
NULL |
10 |
但是,据我所知 - 至少在 16.2 中 - 在枢轴运算符中使用子查询进行枢轴(例如 for typ in (Select Distinct typ from tbl )时,您无法物理化结果。这将动态定义的枢轴限制为最终结果集。但是,当您明确定义字段时(例如for typ in ('1a','1b','1c','2a' )),您可以从数据透视表创建视图、易失性或物理表。希望 Teradata 能够增强这一功能,以便在未来包含子查询。
您可以使用多个聚合函数进行透视:
SELECT *
from tbl pivot (sum(val) as "Sum", count(val) as "Count"
for typ in (Select distinct typ from tbl)
) tmp
order by 1
| id |
2a_Sum |
1c_Sum |
1a_Sum |
1b_Sum |
2a_Count |
1c_Count |
1a_Count |
1b_Count |
| aaa |
NULL |
7 |
10 |
20 |
0 |
1 |
1 |
1 |
| bbb |
10 |
NULL |
5 |
NULL |
1 |
0 |
1 |
0 |
还有一个 unpivot 函数可用于将长表转换为宽表。感谢@dnoeth 在下面的 cmets 中提供解决方案。