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
 

你可能感兴趣的:(SQL Server)