• sql中 with rollup 、with cube、grouping 统计函数用法


    with rollup 、with cube、grouping
    CUBE 和 ROLLUP 之间的区别在于:
    CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
    ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
    grouping:
    当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。

    --------------------------------------------------------------------------------

    首先创建测试表、添加数据。
    table #t(a int,b int,c int,d int,e int)
    insert into #t values(1,2,3,4,5)
    insert into #t values(1,2,3,4,6)
    insert into #t values(1,2,3,4,7)
    insert into #t values(1,2,3,4,8)
    insert into #t values(1,3,3,4,5)
    insert into #t values(1,3,3,4,6)
    insert into #t values(1,3,3,4,8)
    insert into #t values(1,3,3,4,7)

    insert into #t values(2,2,2,4,5)
    insert into #t values(2,2,3,4,6)
    insert into #t values(2,2,4,4,7)
    insert into #t values(2,2,5,4,8)  
      insert into #t values(2,3,3,4,6)
      insert into #t values(2,3,3,4,8)
      insert into #t values(2,3,3,4,7)
    
    
    情况一:只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可。
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    sum(b),sum(c),sum(d),sum(e) from #t group by a with rollup
    
    
    
    情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
        b,
    sum(c),sum(d),sum(e) from #t 
    group by a,b with rollup 
    having grouping(b)=0 or grouping(a)=1
    
    
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
        b,
        c,
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(c)=0 or grouping(a)=1
    
    
    
    情况三:有多个分类汇总列,需要全部的小计和合计
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
        case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varcharend b,
        case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varcharend c,
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    
    
    
    另外一种显示小计的方式
    case when grouping(a)=1 then '合计' 
        when grouping(b)=1 then cast(a as varchar)+'小计'
        else cast(a as varcharend a,
        case when grouping(b)=0 and grouping(c)=1 
        then cast(b as varchar)+'小计' else cast(b as varcharend b,
        case when grouping(c)=1 and grouping(b)=0 
        then '' else cast(c as varcharend c,
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    
    
    
    情况四:有多个分类汇总列,需要部分的小计和合计
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
        b,
        case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varcharend c,
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(a)=1 or grouping(b)=0
    
    
    
    case when grouping(a)=1 then '合计' else cast(a as varcharend a,
        case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varcharend b,
        c,
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(a)=1 or grouping(b)=1 or grouping(c)=0

    引用:http://www.cnblogs.com/yiway/archive/2007/11/12/957281.html


    
    
  • 相关阅读:
    从传统BI报表系统上重构指标库
    autoload魔术方法的妙用
    kerberos委派详解
    一篇文章弄懂session的两种存储方式
    一款专门针对高质量女性的易语言钓鱼样本简单分析
    长城杯线上赛wp
    羊城杯WP
    ICMP隧道通信原理与通信特征
    浅析栈溢出遇到的坑及绕过技巧
    从本地到WordPress代码注入
  • 原文地址:https://www.cnblogs.com/xiaonanmu/p/3853396.html
Copyright © 2020-2023  润新知