1. 程式人生 > >------------------合計、小計的用法-----------------

------------------合計、小計的用法-----------------

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)

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

/*a                              b           c           d           e          
------------------------------ ----------- ----------- ----------- -----------
1                              2           12          16          26
1                              3           12          16          26
2                              2           14          16          26
2                              3           15          16          26
合計                             NULL        53          64          104

(所影響的行數為 5 行)

select
  case when grouping(a)=1 then '合計' else cast(a as varchar) end a, b, c, sum(d) as d,sum(e) as e
from
  #t
group by
  a,b,c
with rollup
  having grouping(c)=0 or grouping(a)=1
a                              b           c           d           e          
------------------------------ ----------- ----------- ----------- -----------
1                              2           3           16          26
1                              3           3           16          26
2                              2           2           4           5
2                              2           3           4           6
2                              2           4           4           7
2                              2           5           4           8
2                              3           3           12          21
2                              3           6           4           5
合計                             NULL        NULL        64          104

(所影響的行數為 9 行)


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) as d,sum(e) as e
from
  #t
group by
  a,b,c
with rollup
  having grouping(a)=1 or grouping(b)=0

a                              b           c                              d           e          
------------------------------ ----------- ------------------------------ ----------- -----------
1                              2           3                              16          26
1                              2           小計                             16          26
1                              3           3                              16          26
1                              3           小計                             16          26
2                              2           2                              4           5
2                              2           3                              4           6
2                              2           4                              4           7
2                              2           5                              4           8
2                              2           小計                             16          26
2                              3           3                              12          21
2                              3           6                              4           5
2                              3           小計                             16          26
合計                             NULL        NULL                           64          104

(所影響的行數為 13 行)


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, sum(c) as c, sum(d) as d,sum(e) as e from #t
group by
   a,b,c
with rollup
   having grouping(a)=1 or grouping(b)=1 or grouping(c)=0

drop table #t

a                              b                              c           d           e          
------------------------------ ------------------------------ ----------- ----------- -----------
1                              2                              12          16          26
1                              3                              12          16          26
1                              小計                             24          32          52
2                              2                              2           4           5
2                              2                              3           4           6
2                              2                              4           4           7
2                              2                              5           4           8
2                              3                              9           12          21
2                              3                              6           4           5
2                              小計                             29          32          52
合計                             NULL                           53          64          104

(所影響的行數為 11 行)

*/