在teradata sql中完成数据透视

Jef*_*mer 3 teradata

假设我有一个返回如下值的查询:

id    type     value
aaa   1a        10
aaa   1b        20
aaa   1c        7
bbb   2a        10
bbb   1a        5
Run Code Online (Sandbox Code Playgroud)

有超过5000万行和240种可能的"类型".我想建立一个枢轴,每个id都有一行,每个type都是它自己的列:

id   1a   1b   1c   2a
aaa  10   20   7    
bbb  5              10
Run Code Online (Sandbox Code Playgroud)

我可以在SQL服务器中执行此操作,但我不知道如何在Teradata中执行此操作.制作CASE语句的列数太多了.但是,每个不同的type都在表字段中,如果有任何帮助的话.

kas*_*arg 5

Teradata SQL中没有透视功能.这里回答了类似的问题 - teradata sql将多次出现转移到其他列中.

为了最好地实现您想要的而不必手动写出250个案例,您应该在某种循环或集合中使用有序分析函数.尝试从Teradata Developer Exchange中搜索"loop"标签 - http://developer.teradata.com/tag/loop

以下是我将如何做到这一点:使用另一种编程语言(Python)来重复文本/预制SQL并将其改为仅两个变量250次,从1到250,并生成完整的长sql.只重复SELECT DISTINCT id最后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
Run Code Online (Sandbox Code Playgroud)

你可以使用这个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)
Run Code Online (Sandbox Code Playgroud)