SQL Server中Rollup关键字使用技巧

首先创建测试表、添加数据。
None.gif create  table  #t(a  int ,b  int ,c  int ,d  int ,e  int )
None.gif
insert  into  #t  values ( 1 , 2 , 3 , 4 , 5 )
None.gif
insert  into  #t  values ( 1 , 2 , 3 , 4 , 6 )
None.gif
inser t into  #t  values ( 1 , 2 , 3 , 4 , 7 )
None.gif
insert  into  #t  values ( 1 , 2 , 3 , 4 , 8 )
None.gif
insert  into  #t  values ( 1 , 3 , 3 , 4 , 5 )
None.gif
insert  into  #t  values ( 1 , 3 , 3 , 4 , 6 )
None.gif
inser t into  #t  values ( 1 , 3 , 3 , 4 , 8 )
None.gif
inser t into  #t  values ( 1 , 3 , 3 , 4 , 7 )
None.gif
None.gif
insert  into  #t  values ( 2 , 2 , 2 , 4 , 5 )
None.gif
insert  into  #t  values ( 2 , 2 , 3 , 4 , 6
None.gif
insert  into  #t  values ( 2 , 2 , 4 , 4 , 7 )
None.gif
insert  into  #t  values ( 2 , 2 , 5 , 4 , 8 )
None.gif
insert  into  #t  values ( 2 , 3 , 6 , 4 , 5 )
None.gif
insert  into  #t  values ( 2 , 3 , 3 , 4 , 6 )
None.gif
insert  into  #t  values ( 2 , 3 , 3 , 4 , 8 )
None.gif
insert  into  #t  values ( 2 , 3 , 3 , 4 , 7 )
情况一: 只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可。
None.gif select  case  when  grouping (a) = 1 then ' 合计 ' else  cast (a  as  varchar end  a,
None.gif
sum (b), sum (c), sum (d), sum (e)  from  #t  group by  a  with  rollup

情况二: 有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。
None.gif select  case  when  grouping (a) = then ' 合计 ' else  cast (a  as  varchar end  a,
None.gif    b,
None.gif
sum (c), sum (d), sum (e)  from  #t 
None.gif
group  by  a,b  with  rollup 
None.gif
having  grouping (b) = o r grouping (a) = 1
None.gif selec t case  when  grouping (a) = then  ' 合计 else  cast (a  as  varchar end  a,
None.gif    b,
None.gif    c,
None.gif
sum (d), sum (e)  from  #t 
None.gif
group  by  a,b,c  with  rollup 
None.gif
having  grouping (c) = or  grouping (a) = 1

情况三: 有多个分类汇总列,需要全部的小计和合计
None.gif select  case  when  grouping (a) = then  ' 合计  else  cast (a  as  varchar end  a,
None.gif
case  when  grouping (b) = and  grouping (a) = then ' 小计 ' else  cast (b  as  varchar end  b,
None.gif
case  when  grouping (c) = and  grouping (b) = 0 then ' 小计 ' else  cast (c  as  varchar end  c,
None.gif
sum (d), sum (e)  from  #t 
None.gif
group  by  a,b,c  with  rollup 

另外一种显示小计的方式
None.gif select c ase  when  grouping (a) = 1 then ' 合计 '
None.gif
when  grouping (b) = 1 then  cast (a  as  varchar ) + ' 小计 '
None.gif
else  cast (a  as  varchar end  a,
None.gif
case  when  grouping (b) = and  grouping (c) = 1
None.gif
then  cast (b  as  varchar ) + ' 小计 ' else  cast (b  as  varchar end  b,
None.gif
case  when  grouping (c) = and  grouping (b) = 0
None.gif
then  '' else  cast (c  as  varchar end  c,
None.gif
sum (d), sum (e)  from  #t 
None.gif
group  by  a,b,c  with  rollup 

情况四: 有多个分类汇总列,需要部分的小计和合计
None.gif select  cas e when  grouping (a) = then ' 合计 ' else  cast (a  as  varchar end  a,
None.gif    b,
None.gif
case  when  grouping (c) = 1 and  grouping (b) = 0 then ' 小计 ' else  cast (c  as  varchar end  c,
None.gif
sum (d), sum (e)  from  #t 
None.gif
group  by  a,b,c  with  rollup 
None.gif
having  grouping (a) = 1 or  grouping (b) = 0

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