在teradatasql中实现pivot

在teradatasql中实现pivot,teradata,Teradata,假设我有一个返回如下值的查询: 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

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

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 server中执行此操作,但我不知道如何在Teradata中执行此操作。有太多的栏目,我无法做出案例陈述。但是,如果有帮助的话,每个不同的类型都在一个表字段中。

Teradata SQL中没有pivot函数。这里回答了一个类似的问题-

为了在不需要手动写出250个案例的情况下达到您想要的效果,您应该在某种循环或集合中使用有序的分析函数。尝试从Teradata Developer Exchange搜索循环标记-

我将这样做:使用另一种编程语言Python对文本/预制SQL进行重复,并将其仅两个变量更改250次,从1更改为250,然后生成完整的长SQL。仅重复SELECT DISTINCT id和last FROM mytable行之间的部分:

选择不同的 身份证件 -重复从这里开始 ,选择SUMvalue-假设每个id都有唯一的类型 从选择不同的 身份证件 价值 类型 从mytable 按类型和按id排序的合格等级超额分配ASC=1-变量1 AS类型_1-变量2 -重复到此为止 从mytable 您可以使用以下python:

对于1251范围内的i: 印刷品\ ,选择SUMvalue-假设每个id都有唯一的类型\ 从选择不同的\ 身份证\ ,价值\ ,类型\ 从mytable\ 按id ASC=%d按类型顺序限定等级超额分配-变量1\ \ 作为类型%d-变量2\ %我,我
TD 14.10中添加了一个TD_UNPIVOT函数,可在TD_SYSFNLIB中找到

PIVOT和UNPIVOT SQL命令是在Teradata 16中添加的,它们可以在SQL函数、运算符、表达式和谓词手册中找到。目前,我无法在在线手册中找到它们,因此您需要从Teradata.com下载PDF


在Teradata 16中使用PIVOT函数时,假设您的类型位于一个名为mytypetable的表中,情况可能如下所示:

选择 * 从…起 mytable PIVOT SumType中类型的值从mytypetable中选择类型作为临时数据透视 订购人 身份证件
一个缺点是您无法决定列的顺序

Pivot功能至少早在v16.1版本就已添加:

为这个答案提供一些例子

v16.2及更新版本允许您从数据透视中的表中选择不同的值,而16.1版则需要指定要透视的字段。下面提供了两个例子

创建示例表的DDL:

创建表tblid varchar3,类型varchar2,val smallint; 插入tbl‘aaa’、‘1a’、10中; 插入tbl‘aaa’、‘1b’、20中; 插入tbl‘aaa’、‘1c’、7中; 插入tbl‘bbb’、‘2a’、10中; 插入tbl‘bbb’、‘1a’、5中; 在16.1中,必须指定字段以透视注释双引号将类型名称转换为有效列名:

挑选* 来自tbl pivot sumval 对于“1a”as 1a、“1b”as 1b、“1c”as 1c、“2a”as 2a中的类型 tmp 16.2更加灵活,无需明确指定透视字段:

挑选* 来自tbl pivot sumval 对于中的类型,请从tbl中选择不同的类型 tmp 按1订购 两个结果相同:

身份证件 1a 1b 1c 2a aaa 10 20 7. 无效的 bbb 5. 无效的 无效的 10
这两个函数都可以在“函数和运算符”一章“聚合函数:选择中的类型”中在线找到。。。限制为16个值,并且无法对列进行排序,这两种情况都使它变得无用。感谢@dnoeth提供额外的上下文。我认为它在有限的环境中有用,在较小的范围内进行快速的特别查询,但我同意它严重不足。关于您的UNPIVOT问题,这是可行的:在a1、b1、c1、a2 tmp中为typ选择*FROM y UNPIVOT val