zoukankan      html  css  js  c++  java
  • 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


    
    
  • 相关阅读:
    随机过程之第一次出现的期望
    js模板引擎介绍搜集
    qt的安装和debug
    $parse/$eval和$observe/$watch如何区分
    angular controller as syntax vs scope
    Angularjs Controller 间通信机制
    Ng-template寄宿方式
    angularjs移除不必要的$watch
    angularJs项目实战!02:前端的页面分解与组装
    推荐几个可以与PhoneGap很好搭配的UI框架
  • 原文地址:https://www.cnblogs.com/xiaonanmu/p/3853396.html
Copyright © 2011-2022 走看看