如何在Teradata中不使用聚合函数实现长表转宽表
Teradata 无需实际聚合实现长表转宽表的方案
可以实现,核心思路是先给同一Initial分组下的每个Name分配唯一的行号,再通过伪聚合(仅满足语法要求,无实际聚合计算)完成旋转:
- 同一分组+行号的组合下只会有1个唯一的Name值,使用MAX/MIN聚合时只会返回原值,不会对原始数据做任何合并、计算操作。
方案1:ROW_NUMBER + CASE WHEN(最直观,无需用到PIVOT语法)
SELECT Initial, MAX(CASE WHEN rn = 1 THEN "Name" END) AS Name1, MAX(CASE WHEN rn = 2 THEN "Name" END) AS Name2, MAX(CASE WHEN rn = 3 THEN "Name" END) AS Name3, MAX(CASE WHEN rn = 4 THEN "Name" END) AS Name4 FROM ( SELECT Initial, "Name", -- 同Initial下按Name排序分配唯一行号 ROW_NUMBER() OVER(PARTITION BY Initial ORDER BY "Name") AS rn FROM MyTab ) t GROUP BY Initial ORDER BY Initial;
方案2:ROW_NUMBER + PIVOT(满足PIVOT语法要求,无实际聚合)
SELECT * FROM ( SELECT Initial, "Name", -- 生成旋转后的列名 'Name' || TRIM(ROW_NUMBER() OVER(PARTITION BY Initial ORDER BY "Name")) AS col_name FROM MyTab ) t PIVOT( MAX("Name") -- 此处MAX仅满足语法要求,每个col_name对应唯一值,无聚合计算 FOR col_name IN ('Name1' AS Name1, 'Name2' AS Name2, 'Name3' AS Name3, 'Name4' AS Name4) ) p ORDER BY Initial;
两种方案执行后返回的结果完全符合要求的宽表结构。如果分组下的最大行数不固定,需要动态生成列,可以拼接动态SQL执行。
内容的提问来源于stack exchange,提问作者MCornejo
相关产品推荐
相关产品推荐

