如何在Teradata中使用SQL转置表格至指定列结构?
在Teradata中实现行转列(Pivot)的解决方案
针对你需求的行转列场景,Teradata有两种常用的实现方式,分别适用于不同版本的环境,我给你详细说明:
方法1:使用Teradata原生PIVOT语法(推荐,适用于Teradata 16.0及以上版本)
Teradata从16.0版本开始支持标准的PIVOT操作,语法简洁易读,正好匹配你的需求:
SELECT * FROM ( SELECT column1, column2, column3, count FROM squema.table ) AS src PIVOT ( SUM(count) -- 因为是聚合统计值,这里用SUM(如果count本身是单一行对应值,SUM和MAX/Min效果一致) FOR column3 IN ( 'tip1' AS tip1, 'tip2' AS tip2, 'tip3' AS tip3 ) ) AS pivoted_result;
代码说明:
- 内层子查询
src先筛选出需要的基础数据 PIVOT子句里,SUM(count)指定要聚合的目标列(PIVOT必须配合聚合函数使用)FOR column3 IN (...)定义要转成列的原始字段值,同时指定转后的列别名
方法2:使用CASE WHEN + GROUP BY(兼容所有Teradata版本)
如果你的Teradata版本低于16.0,不支持PIVOT语法,可以用传统的CASE WHEN结合分组来实现,兼容性更好:
SELECT column1, column2, SUM(CASE WHEN column3 = 'tip1' THEN count ELSE 0 END) AS tip1, SUM(CASE WHEN column3 = 'tip2' THEN count ELSE 0 END) AS tip2, SUM(CASE WHEN column3 = 'tip3' THEN count ELSE 0 END) AS tip3 FROM squema.table GROUP BY column1, column2;
代码说明:
- 每个
CASE WHEN语句对应一个要转成的列,匹配column3的特定值时取对应的count,否则取0 - 通过
GROUP BY column1, column2把相同column1和column2的行合并,得到一行汇总结果
这两种方法执行后,都能得到你想要的目标表格:
| column1 | column2 | tip1 | tip2 | tip3 |
|---|---|---|---|---|
| ab1 | ab2 | 123 | 23 | 5 |
内容的提问来源于stack exchange,提问作者Victoria Ubaldo
相关产品推荐
相关产品推荐

