使用CASE WHEN
问题描述:
我有如下表:使用CASE WHEN
Email | value | group
a | 1 | x
a | 2 | y
a | 3 | y
b | 3 | z
我以前写的代码,通过不同的电子邮件每组拉值的总和,得到这个:
Email | value | group
a | 1 | x
a | 5 | y
b | 3 | z
的代码看起来像这样:
SELECT distinct email,
group,
sum (value)
from t
group by email, group
现在,我想通过使用情况下,要得到这个输出组组总结:
Email | value | super_group
a | 6 | x_y
b | 3 | z
但这个代码不工作:
SELECT distinct email,
CASE when group in (x,y)
then 'x_y'
else 'z'
end as super_group,
sum (value)
from t
group by email, super_group
答
您可以使用ARRAY_AGG
此外,如果您使用的是GROUP BY你不需要DISTINCT。试试这个方法:
首先,你必须定义数组类型是这样的:
-- note the varchar with size 20 is a sample you should pick yours
-- and the size of the array is also an example
CREATE TYPE group_array AS VARCHAR(20) ARRAY[100];
然后你就可以查询与汇总组值返回数组类型。
SELECT email,
sum (value) as value,
ARRAY_AGG(group, NEW group_array()) as super_group
FROM t
GROUP BY email
这应该给你的结果是:如果你正在使用的Teradata的新版本,你可以使用XMLAGG
email | value | super_group
a | 6 | (x, y)
b | 3 | (z)
答
()来做到这一点:
SELECT
email,
sum(value),
trim(trailing '_' FROM (XMLAGG(group || '_' ORDER BY group) (VARCHAR(50))))
FROM table
GROUP BY 1
您正在使用哪个数据库? –
我使用Teradata – NBC
谢谢。有什么建议么? – NBC