数据汇总加排序

程序选择了: 项目名称,项目年度,地市,申请单位,支持金额这几个字段
其中汇总字段为项目年度,地市
查询结果列就要按需要项目名称,项目年度,地市,申请单位,支持金额排列好
并能按指定的字段进行排序处理
要求生成的结果:
=================================================================
序号   项目名称    项目年度    地市            申请单位    支持金额
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 行)

--*/