如何在Teradata SQL中按类别将行值提取至独立列?
行转列聚合查询实现方案
要将源表按id合并为单行,把AmtCategory对应的金额映射为指定列,可使用条件聚合的方式实现,这是跨数据库通用的写法:
SELECT id, -- 匹配AmtCategory=1,提取对应金额作为AmtPaid MAX(CASE WHEN AmtCategory = 1 THEN Amount END) AS AmtPaid, -- 匹配AmtCategory=2,提取对应金额作为AmtReturned MAX(CASE WHEN AmtCategory = 2 THEN Amount END) AS AmtReturned, -- 匹配AmtCategory=3,提取对应金额作为Fees MAX(CASE WHEN AmtCategory = 3 THEN Amount END) AS Fees FROM 你的源表名称 GROUP BY id;
说明:
GROUP BY id确保每个id仅返回一行数据;CASE WHEN会根据AmtCategory的值筛选对应金额,不匹配的行返回NULL;- 使用
MAX()聚合函数是为了忽略NULL值,保留有效金额。如果同一id下同一分类有多条记录需要求和,把MAX()换成SUM()即可。
如果使用支持PIVOT语法的数据库(如SQL Server、Oracle),也可以用以下写法:
SELECT id, [1] AS AmtPaid, [2] AS AmtReturned, [3] AS Fees FROM ( SELECT id, AmtCategory, Amount FROM 你的源表名称 ) AS 临时表 PIVOT ( MAX(Amount) -- 同样,需要求和就换成SUM(Amount) FOR AmtCategory IN ([1], [2], [3]) ) AS 透视表;
内容的提问来源于stack exchange,提问作者user20381471
相关产品推荐
相关产品推荐

