2011-07-15 126 views
1

我有以下SQL。大部分的G1和G2都是一對一的關係。一些是一對多的關係。以下SQL將顯示太多「Total2」。當G1和G2是一對一時,是否可以刪除這些Total2行?SQL Server條件彙總(僅當有多個子組時彙總)

SELECT CASE WHEN GROUPING_ID(G1) = 1 THEN 'Total1' ELSE G1 END, 
     CASE WHEN GROUPING_ID(G2) = 1 THEN 'Total2' ELSE G2 END, 
     SUM(a), 
     SUM(b), 
     count(*) 
FROM data 
GROUP BY 
     G1, G2 WITH ROLLUP 

回答

1

不幸的是我沒有任何想法如何避免子查詢這裏

有了子查詢,我們可以使用一個絕招 - 當我們通過G1,並在同一時間G1和G2有1對1的關係組(即等於)這意味着最大(G2)將等於min(G2),並在此條件將使我們能夠建立一個WHERE子句和擺脫他們

代碼可能是這樣的

select * from 
(
SELECT CASE 
WHEN GROUPING_ID(G1) = 1 THEN 'Total1' ELSE G1 END as G1,  
MIN(g2) as min_g2, 
max(g2) as max_g2, 
CASE WHEN GROUPING_ID(G2) = 1 THEN 'Total2' ELSE G2 END as G2, 
     SUM(a) as SUM_A,  
     SUM(b) as SUM_B,  
      count(*) as cnt 
FROM data 
GROUP BY   G1, G2 
WITH ROLLUP 
) t 
where 
not (min_g2 = max_g2 and g2 = 'Total2')