sql server 關於 數據彙總分析

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

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章