SQL Server条件汇总(仅当有多个子组时汇总)

时间:2011-07-15 04:47:10

标签: sql-server sql-server-2005 sql-server-2008 rollup

我有以下SQL。大多数G1和G2是一对一的关系。一些是一对多的关系。以下SQL将显示太多“ Total2 ”。当G1和G2是一对一时,是否可以删除这些 Total2 行?

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 个答案:

答案 0 :(得分:1)

不幸的是,我不知道如何在这里避免使用子查询

使用子查询我们可以使用一个技巧 - 当我们按G1分组并且同时G1和G2具有1对1的关系(即相等)时,意味着max(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')