資料匯總加排序

來源:互聯網
上載者:User

程式選擇了: 項目名稱,項目年度,地市,申請單位,支援金額這幾個欄位
其中彙總欄位為項目年度,地市
查詢結果列就要按需要項目名稱,項目年度,地市,申請單位,支援金額排列好
並能按指定的欄位進行排序處理
要求產生的結果:
=================================================================
序號   項目名稱    項目年度    地市            申請單位    支援金額
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 行)

--*/

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.