2011-07-15 127 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')