SQL Server中Rollup关键字使用技巧

首先创建测试表、添加数据。

create   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 , 6 , 4 , 5 )
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即可。

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
sum (b), sum (c), sum (d), sum (e)  from  #t  group   by  a  with  rollup


情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
    b,
sum (c), sum (d), sum (e)  from  #t 
group   by  a,b  with  rollup 
having   grouping (b) = 0   or   grouping (a) = 1

 

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
    b,
    c,
sum (d), sum (e)  from  #t 
group   by  a,b,c  with  rollup 
having   grouping (c) = 0   or   grouping (a) = 1


情况三:有多个分类汇总列,需要全部的小计和合计

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
    
case   when   grouping (b) = 1   and   grouping (a) = 0   then   ' 小计 '   else   cast (b  as   varchar end  b,
    
case   when   grouping (c) = 1   and   grouping (b) = 0   then   ' 小计 '   else   cast (c  as   varchar end  c,
sum (d), sum (e)  from  #t 
group   by  a,b,c  with  rollup 


另外一种显示小计的方式

select   case   when   grouping (a) = 1   then   ' 合计 '  
    
when   grouping (b) = 1   then   cast (a  as   varchar ) + ' 小计 '
    
else   cast (a  as   varchar end  a,
    
case   when   grouping (b) = 0   and   grouping (c) = 1  
    
then   cast (b  as   varchar ) + ' 小计 '   else   cast (b  as   varchar end  b,
    
case   when   grouping (c) = 1   and   grouping (b) = 0  
    
then   ''   else   cast (c  as   varchar end  c,
sum (d), sum (e)  from  #t 
group   by  a,b,c  with  rollup 


情况四:有多个分类汇总列,需要部分的小计和合计

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
    b,
    
case   when   grouping (c) = 1   and   grouping (b) = 0   then   ' 小计 '   else   cast (c  as   varchar end  c,
sum (d), sum (e)  from  #t 
group   by  a,b,c  with  rollup 
having   grouping (a) = 1   or   grouping (b) = 0


 

select   case   when   grouping (a) = 1   then   ' 合计 '   else   cast (a  as   varchar end  a,
    
case   when   grouping (b) = 1   and   grouping (a) = 0   then   ' 小计 '   else   cast (b  as   varchar end  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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值