Search code examples
sql-serversql-server-2005sql-server-2008rollup

SQL Server conditional rollup (only rollup when there are multiple subgroup)


I have the following SQL. Most of the G1 and G2 are one-to-one relationship. A few are one-to-many relationship. The following SQL will show too many "Total2". Is it possible to remove these Total2 rows when G1 and G2 are one-to-one?

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

Solution

  • unfortunately I dont have any idea how to avoid subquery here

    With subquery we may use one trick - when we group by G1 and at the same time G1 and G2 have 1-to-1 relationship (i.e. equal) it means that max(G2) will equal to min(g2) and this condition will allow us to build a where clause and get rid of them

    Code may be like this

    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')