假设我有一个返回如下值的查询:
id type value aaa 1a 10 aaa 1b 20 aaa 1c 7 bbb 2a 10 bbb 1a 5
有> 5000万行和240种可能的“类型”.我想创建一个枢轴,每个id都有一行,每个类型都是它自己的列:
id 1a 1b 1c 2a aaa 10 20 7 bbb 5 10
我可以在sql服务器中执行此操作,但我不知道如何在Teradata中执行此操作.制作CASE语句的列数太多了.但是,每个不同的类型都在表字段中,如果有任何帮助的话.
解决方法
Teradata sql中没有透视功能.这里回答了类似的问题 –
teradata sql pivot multiple occurrences into additional columns.
为了最好地实现您想要的而不必手动写出250个案例,您应该在某种循环或集合中使用有序分析函数.尝试从Teradata Developer Exchange – http://developer.teradata.com/tag/loop搜索“loop”标签
以下是我将如何做到这一点:使用另一种编程语言(Python)来重复文本/预制sql并将其改为仅两个变量250次,从1到250,并生成完整的长sql.只重复SELECT DISTINCT id和last FROM mytable行之间的部分:
SELECT DISTINCT id -- reiteration starts here,(SELECT SUM(value) -- assuming you have unique types for every id FROM (SELECT DISTINCT id,value,type FROM mytable QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=1 -- variable 1 ) ) AS type_1 -- variable 2 -- reiteration ends here FROM mytable
你可以使用这个python:
for i in range(1,251): print " \,(SELECT SUM(value) -- assuming you have unique types for every id \ FROM (SELECT DISTINCT \ id \,value \,type \ FROM mytable \ QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=%d -- variable 1 \ ) \ ) AS type_%d -- variable 2 \ " % (i,i)