说明:
针对4家不同类型的公司进行统计 其中餐饮类公司和食品类公司手动录入区域A小计 其余两家不需要
食品公司全部位于区域A内 餐饮公司位于区域A,B内(共A,B两个区域)
总计产生公式如下
餐饮公司=区域A小计+区域B店铺的销售额
食品公司=区域A小计
其余两家=所有店铺的销售额总和表字段如下
unit(公司) region(区域) shop_Name(店铺名) sales(今年销售额-万元) last_Sales(去年销售额)
餐饮公司 A 店铺A1 1 1
餐饮公司 A 店铺A2 2 2
餐饮公司 A 店铺A3 3 3
餐饮公司 B 区域A小计 50 50
餐饮公司 B 店铺A4 4 4 食品公司 A 店铺B1 1 1
食品公司 A 店铺B21 1 1
食品公司 A 店铺B3 1 1
食品公司 B 区域A小计 80 80 百货公司 A 店铺C 2 2
百货公司 B 店铺C2 3 3
百货公司 B 店铺C4 4 4 贸易公司 A 店铺H 5 1
贸易公司 A 店铺F 5 2
贸易公司 B 店铺H4 1 3 希望得到结果如下
unit(公司) region(区域) shop_Name(店铺名) sales(今年销售额-万元) last_Sales(去年销售额)
餐饮公司 A 店铺A1 1 1
餐饮公司 A 店铺A2 2 2
餐饮公司 A 店铺A3 3 3
餐饮公司 B 区域A小计 50 50
餐饮公司 B 店铺A4 4 4
餐饮公司 B 总计 54 54 食品公司 A 店铺B1 1 1
食品公司 A 店铺B21 1 1
食品公司 A 店铺B3 1 1
食品公司 B 区域A小计 80 80
食品公司 B 总计 80 80 百货公司 A 店铺C 2 2
百货公司 B 店铺C2 3 3
百货公司 B 店铺C4 4 4
百货公司 B 总计 9 9 贸易公司 A 店铺H 5 1
贸易公司 A 店铺F 5 2
贸易公司 B 店铺H4 1 3
贸易公司 B 总计 11 6
针对4家不同类型的公司进行统计 其中餐饮类公司和食品类公司手动录入区域A小计 其余两家不需要
食品公司全部位于区域A内 餐饮公司位于区域A,B内(共A,B两个区域)
总计产生公式如下
餐饮公司=区域A小计+区域B店铺的销售额
食品公司=区域A小计
其余两家=所有店铺的销售额总和表字段如下
unit(公司) region(区域) shop_Name(店铺名) sales(今年销售额-万元) last_Sales(去年销售额)
餐饮公司 A 店铺A1 1 1
餐饮公司 A 店铺A2 2 2
餐饮公司 A 店铺A3 3 3
餐饮公司 B 区域A小计 50 50
餐饮公司 B 店铺A4 4 4 食品公司 A 店铺B1 1 1
食品公司 A 店铺B21 1 1
食品公司 A 店铺B3 1 1
食品公司 B 区域A小计 80 80 百货公司 A 店铺C 2 2
百货公司 B 店铺C2 3 3
百货公司 B 店铺C4 4 4 贸易公司 A 店铺H 5 1
贸易公司 A 店铺F 5 2
贸易公司 B 店铺H4 1 3 希望得到结果如下
unit(公司) region(区域) shop_Name(店铺名) sales(今年销售额-万元) last_Sales(去年销售额)
餐饮公司 A 店铺A1 1 1
餐饮公司 A 店铺A2 2 2
餐饮公司 A 店铺A3 3 3
餐饮公司 B 区域A小计 50 50
餐饮公司 B 店铺A4 4 4
餐饮公司 B 总计 54 54 食品公司 A 店铺B1 1 1
食品公司 A 店铺B21 1 1
食品公司 A 店铺B3 1 1
食品公司 B 区域A小计 80 80
食品公司 B 总计 80 80 百货公司 A 店铺C 2 2
百货公司 B 店铺C2 3 3
百货公司 B 店铺C4 4 4
百货公司 B 总计 9 9 贸易公司 A 店铺H 5 1
贸易公司 A 店铺F 5 2
贸易公司 B 店铺H4 1 3
贸易公司 B 总计 11 6
/*
现在我们要用with rollup实现分级汇总结果显示格式
可以先看下3实例分级汇总过滤,在查询的时候实现grouping(列名)
*/
declare @T table
(
groups char(10),
Item varchar(10),
Color varchar(10),
Quantity int
)
insert into @T select 'aa','table','blue',124
union all select 'bb','table','red',-23
union all select 'bb','cup','green',-23
union all select 'aa','chair','blue',101
union all select 'aa','chair','red',-90
--select groups,Item,color,sum(Quantity) Quantity,
-- grouping(groups) gp,
-- grouping(Item) Item,
-- grouping(Color) Color
--from @T group by groups,Item,Color with rollup
select case when grouping(groups)=1 then '总计' else groups end as 'groups',
isnull(case when grouping(groups)=0 and grouping(Item)=1 then N'小计'+groups else Item end,'') as 'Item',
isnull(case when grouping(groups)=0 and grouping(Color)=1 and grouping(Item)=0 then Item+N'小计' else Color end,'') as 'Color',
sum(Quantity) Quantity
from @T group by groups,Item,Color with rollup
/*
groups Item Color Quantity
---------- ------------ ------------ -----------
aa chair blue 101
aa chair red -90
aa chair chair小计 11
aa table blue 124
aa table table小计 124
aa 小计aa 135
bb cup green -23
bb cup cup小计 -23
bb table red -23
bb table table小计 -23
bb 小计bb -46
总计 89
*/
不过with rollup汇总一下子解决不了这个问题
好象还有一个功能跟with rollup类似的不太记得了!
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)=1select
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 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 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)=0drop table #t/*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 行)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 行)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 行)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 行)*/