2017-06-07 100 views
1

我有如下表:使用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 
+0

您正在使用哪个数据库? –

+0

我使用Teradata – NBC

+0

谢谢。有什么建议么? – NBC

回答

1

您可以使用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) 

参考ARRAY_AGG

1

()来做到这一点:

SELECT 
    email, 
    sum(value), 
    trim(trailing '_' FROM (XMLAGG(group || '_' ORDER BY group) (VARCHAR(50)))) 
FROM table 
GROUP BY 1