CUBE 和 ROLLUP 之間的區別在於:
CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。
ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。
例子:
if object_id('a') is not null
drop table a
create table a
(
bm varchar(20), --編碼
ck varchar(2), --倉庫
sl int --數量
)
insert into a
select '01' ,'a', 6
union all
select '01','b',7
union all
select '02','a',8
union all
select '02','b',9
select * from a
(1)rollup 的用法
SELECT bm, hj=
case when grouping(ck)=0
then
ck
else
bm+'合計'
end
, Sum(sl) as sl
FROM A
GROUP BY bm, ck WITH ROLLUP
/*
01 a 6
01 b 7
01 01合計 13
02 a 8
02 b 9
02 02合計 17
NULL NULL 30
*/
(2)關於cuble的基本用法。
SELECT bm, ck, Sum(sl) as sl
FROM A
GROUP BY bm,ck WITH cube
/*
01 a 6
01 b 7
01 NULL 13
02 a 8
02 b 9
02 NULL 17
NULL NULL 30
NULL a 14
NULL b 16
*/
(1) 不使用用rollup實現彙總的結果。
if object_id('ss') is not null
drop table ss
create table ss
(
gys varchar(10),
wlbm varchar(5),
jcsl int,
hgsl int
)
delete ss
insert into ss values('華南集團','001',500,500)
insert into ss values('華南集團','001',200,0)
insert into ss values('華南集團','001',100,100)
insert into ss values('華南集團','002',200,0)
insert into ss values('華南集團','002',100,100)
insert into ss values('江林集團','001',600,600)
insert into ss values('江林集團','001',200,0)
insert into ss values('花海斯通','002',200,200)
insert into ss values('花海斯通','002',100,0)
select 供應商,物料編號,檢測批次總數,合格數量,pj as '平均' from
(
select sum(zs) as '檢測批次總數',gys as '供應商','總計' as'物料編號' ,sum(hgsl) as '合格數量' ,
(cast(sum (hgsl) as float)/cast(sum(zs) as float)) as 'pj'
from
(select count(*) as 'zs' ,gys ,wlbm ,sum (case when hgsl=0 then 0 else 1 end) as 'hgsl' ,
(cast(sum (case when hgsl=0 then 0 else 1 end) as float)/cast(count(*) as float)) as 'pj'
from ss group by gys , wlbm) t group by gys
union all
select count(*) as 'zs' ,gys ,wlbm ,sum (case when hgsl=0 then 0 else 1 end) as 'hgsl' ,
(cast(sum (case when hgsl=0 then 0 else 1 end) as float)/cast(count(*) as float)) as 'pj'
from ss group by gys,wlbm) j order by CHARINDEX(left(供應商,2),'華南,江林,花海'),物料編號 asc
/*
華南集團 001 3 2 0.66666666666666663
華南集團 002 2 1 0.5
華南集團 總計 5 3 0.59999999999999998
江林集團 001 2 1 0.5
江林集團 總計 2 1 0.5
花海斯通 002 2 1 0.5
花海斯通 總計 2 1 0.5
*/
(2)通過 rollup實現數據彙總:
if object_id('[tb]') is not null
drop table [tb]
go
create table [tb]([供應商] varchar(8),[物料編碼] varchar(10),[檢驗數量] int,[合格數量] int)
insert [tb]
select '華南集團','001',500,500 union all
select '華南集團','001',200,0 union all
select '華南集團','001',100,100 union all
select '華南集團','002',200,0 union all
select '華南集團','002',100,100 union all
select '江林集團','001',600,600 union all
select '江林集團','001',200,0 union all
select '花海斯通','002',200,200 union all
select '花海斯通','002',100,0
go
select
供應商=case when GROUPING(物料編碼)=0 then 供應商 else 供應商+'合計' end,
物料編碼=case when GROUPING(物料編碼)=0 then 物料編碼 else '' end,
檢驗批次總數=count(*),
合格批次總數=sum(case when 合格數量<>0 then 1 else 0 end),
比例=cast(sum(case when 合格數量<>0 then 1 else 0 end)*1.0/count(*)as dec(18,2))
from tb
group by 供應商,物料編碼 with rollup
having GROUPING(供應商)=0
order by CHARINDEX(left(供應商,2),'華南,江林,花海')
供應商 物料編碼 檢驗批次總數 合格批次總數 比例
------------ ---------- ----------- ----------- ---------------------------------------
華南集團 001 3 2 0.67
華南集團 002 2 1 0.50
華南集團合計 5 3 0.60
江林集團 001 2 1 0.50
江林集團合計 2 1 0.50
花海斯通 002 2 1 0.50
花海斯通合計 2 1 0.50