2017-06-07 144 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