程式選擇了: 項目名稱,項目年度,地市,申請單位,支援金額這幾個欄位
其中彙總欄位為項目年度,地市
查詢結果列就要按需要項目名稱,項目年度,地市,申請單位,支援金額排列好
並能按指定的欄位進行排序處理
要求產生的結果:
=================================================================
序號 項目名稱 項目年度 地市 申請單位 支援金額
1 名稱1 2004 省直 1公司 100
2 名稱2 2004 省直 2公司 100
3 2004 省直合計 200
4 名稱3 2004 石家莊 3公司 100
5 2004 石家莊合計 100
6 2004合計 300
7 名稱3 2005 石家莊 3公司 100
8 2005 石家莊合計 100
9 2005合計 100
10 總計 400
=================================================================
------------------------------------------------------------------------------------
--假設如下暫存資料表是經過第一次匯總+排序處理得到的(第一次處理不處理小計,總計等)
create table #t(項目名稱 varchar(10),項目年度 varchar(10),地市 varchar(10),申請單位 varchar(10),支援金額 int)
insert #t select '名稱1','2004','省直' ,'1公司',400
union all select '名稱2','2004','省直' ,'2公司',300
union all select '名稱3','2004','石家莊','3公司',200
union all select '名稱3','2005','石家莊','3公司',100
go
--下面是處理
select 項目名稱,項目年度,地市,申請單位,支援金額
from( --這是實現匯總的部分(不考慮小計,總計處理部分的匯總)
select *
,s1=0,s2=項目年度,s3=0,s4=地市,s5=0,s6=申請單位,s7=0 --這是排序需要的
from #t
union all
--這是實現匯總的小計,總計部分
select 項目名稱=case
when grouping(項目年度)=1 then '總計'
else '' end
,項目年度=case
when grouping(項目年度)=0
and grouping(地市)=1
then 項目年度+'合計'
else '' end
,地市=case
when grouping(項目年度)=0
and grouping(地市)=0
and grouping(申請單位)=1
then 地市+'合計'
else '' end
,申請單位=case
when grouping(申請單位)=0 then 申請單位+'合計'
else '' end
,支援金額=sum(支援金額)
,grouping(項目年度),項目年度 --這裡及下面的是排序需要的
,grouping(地市),地市
,grouping(申請單位),申請單位
,grouping(申請單位)+1
from #t
group by 項目年度,地市,申請單位 with rollup --這是要產生小計,總計的分組欄位
)a
order by s1,s2,s3,s4,s5,s6,s7,支援金額 --s1~s6是防止小計,總計排序錯亂需要的,後面的支援金額是其他排序需要的
go
--刪除測試的暫存資料表
drop table #t
/*--測試結果
項目名稱 項目年度 地市 申請單位 支援金額
---------- -------------- -------------- -------------- -----------
名稱1 2004 省直 1公司 400
1公司合計 400
名稱2 2004 省直 2公司 300
2公司合計 300
省直合計 700
名稱3 2004 石家莊 3公司 200
3公司合計 200
石家莊合計 200
2004合計 900
名稱3 2005 石家莊 3公司 100
3公司合計 100
石家莊合計 100
2005合計 100
總計 1000
(所影響的行數為 14 行)
--*/
--上面是按項目年度,地市,申請單位做小計,總計的
--下面是只按項目年度,地市做小計,總計的,比較一下,更容易看出規律
--下面是處理
select 項目名稱,項目年度,地市,申請單位,支援金額
from( --這是實現匯總的部分(不考慮小計,總計處理部分的匯總)
select *
,s1=0,s2=項目年度,s3=0,s4=地市,s5=0 --這是排序需要的
from #t
union all
--這是實現匯總的小計,總計部分
select 項目名稱=case
when grouping(項目年度)=1 then '總計'
else '' end
,項目年度=case
when grouping(項目年度)=0
and grouping(地市)=1
then 項目年度+'合計'
else '' end
,地市=case
when grouping(地市)=0
then 地市+'合計'
else '' end
,''
,支援金額=sum(支援金額)
,grouping(項目年度),項目年度 --這裡及下面的是排序需要的
,grouping(地市),地市
,grouping(地市)+1
from #t
group by 項目年度,地市 with rollup --這是要產生小計,總計的分組欄位
)a
order by s1,s2,s3,s4,s5,支援金額 --s1~s6是防止小計,總計排序錯亂需要的,後面的支援金額是其他排序需要的
/*--測試結果
項目名稱 項目年度 地市 申請單位 支援金額
---------- -------------- -------------- ---------- -----------
名稱2 2004 省直 2公司 300
名稱1 2004 省直 1公司 400
省直合計 700
名稱3 2004 石家莊 3公司 200
石家莊合計 200
2004合計 900
名稱3 2005 石家莊 3公司 100
石家莊合計 100
2005合計 100
總計 1000
(所影響的行數為 10 行)
--*/