【问题标题】:SQL Server conditional rollup (only rollup when there are multiple subgroup)SQL Server 条件汇总(仅在有多个子组时汇总)
【发布时间】:2011-10-05 21:03:21
【问题描述】:

我有以下 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

【问题讨论】:

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


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 2014-08-15
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多