分享
 
 
 

模拟多级表头的分组统计

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

原帖地址:

http://community.csdn.net/Expert/topic/3434/3434688.xml?temp=3.246486E-03

--测试数据

create table 单位表 (单位代码 varchar(10),单位名称 varchar(50))

insert 单位表 values('01' ,'中国单位') --1级

insert 单位表 values('0101' ,'山东单位') --2级

insert 单位表 values('010101' ,'山东济南单位') --3级

insert 单位表 values('010102' ,'山东青岛单位') --3级

insert 单位表 values('01010201','山东青岛即默单位一') --4级

insert 单位表 values('01010202','山东青岛即默单位二') --4级

insert 单位表 values('0102' ,'山西单位') --2级

insert 单位表 values('010201' ,'山西大同单位') --3级

insert 单位表 values('0103' ,'陕西单位') --2级

insert 单位表 values('010301' ,'陕西西安单位') --3级

--insert 单位表 values('01030101' ,'陕西西安A单位') --3级

--insert 单位表 values('0103010101' ,'陕西西安aa单位') --3级

insert 单位表 values('010302' ,'陕西咸阳单位') --3级

create table 供应表 (物资编号 varchar(10),物资名称 varchar(50),单位代码 varchar(10),供应数量 int)

insert 供应表 values('0001','电子称','010101',1)

insert 供应表 values('0002','电动机','010101',1)

insert 供应表 values('0001','电子称','01010201',1)

insert 供应表 values('0002','电动机','01010201',1)

insert 供应表 values('0001','电子称','010201',1)

insert 供应表 values('0003','电动刷','010201',1)

insert 供应表 values('0004','电动车','010302',1)

go

/*--要求

分级汇总,然后转置得到如下结果:

select '','','','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位'

union all select '','','','山东单位','山东单位','山东单位','山东单位','山西单位','山西单位','陕西单位','陕西单位','陕西单位'

union all select '','','',' ',' ','山东青岛单位','山东青岛单位',' ',' ',' ',' ',' '

union all select '序号','装备名称','合计','小计','山东济南单位','山东青岛即默单位一','山东青岛即默单位二','小计','山西大同单位','小计','陕西西安单位','陕西咸阳单位'

union all select '','总计','7','4','2','2','','2','2','1','','1'

union all select '1','(0001)电子称','3','2','1','1','','1','1','','',''

union all select '2','(0002)电动机','2','2','1','1','','','','','',''

union all select '3','(0003)电动刷','1','','','','','1','1','','',''

union all select '4','(0004)电动车','1','','','','','','','1','','1'

统计结果说明:

1.单位代码固定每两位为1级

2.统计单位表中所有的最末级,如果该单位在供应表中无数据,则对应显示为0

3.小计是根据二级单位合并得到

4.结果中的表头是分级的,一级单位在第一行,二级单位在第二行,如果该单位已经在统计数据,即"序号','装备名称','合计'"这行出现,则不再在对应的级数的表头里面出现

--*/

--查询处理

declare @i varchar(10),@s11 varchar(8000),@s12 varchar(8000),@s13 varchar(8000)

,@s2 varchar(8000),@s3 varchar(8000),@s14 varchar(8000)

select @s11='',@s12='',@s13='',@s14=''

,@s2='',@s3=''

select a=left(单位代码,4),b=left(单位代码,len(单位代码)-2),c=len(单位代码)-2

into # from 单位表 b

where not exists(select * from 单位表 where 单位代码 like b.单位代码+'__')

order by 单位代码

select @i=max(len(b)) from #

while @i>'0'

select @s11=',@'+@i+' varchar(8000)'+@s11

,@s12=',@'+@i+'='''''''''','''''''','''''''''''+@s12

,@s13='

set @=null select @'+@i+'=@'+@i+'+case when @=a then '''' else '

+case when @i>'4' then ''','''''''''' end' else ''',''''''+单位名称+'''''''' end' end

+'+'',''''''+单位名称+'''''''',@=a from '

+case when @i<='4' then '# a,单位表 b where left(a.b,'+@i+')=b.单位代码'

else '(select 单位名称=case when a.c>='+@i+' then 单位名称 else '''' end,a.* from # a,单位表 b where left(a.b,'+@i+')=b.单位代码)a' end

+@s13

,@s14='+'' union all select ''+@'+@i+@s14

,@i=@i-2

select @s12=stuff(@s12,1,1,'')

,@s14=stuff(@s14,1,13,'')

select @s2=@s2+','''+case when len(b.单位代码)=4 then '小计' else b.单位名称 end+''''

,@s3=@s3+case

when len(b.单位代码)=4

then ',['+b.单位名称+'_小计]=cast(sum(case left(单位代码,4) when '''+b.单位代码+''' then 供应数量 else 0 end) as varchar)'

else ',['+b.单位名称+']=cast(sum(case 单位代码 when '''+b.单位代码+''' then 供应数量 else 0 end) as varchar)'

end

from 单位表 b

where len(单位代码)=4

or not exists(select * from 单位表 where 单位代码 like b.单位代码+'__')

order by 单位代码

set @s2=replace(@s2,'''','''''')

exec('

select 序号=cast('''' as varchar(10))

,装备名称=case

when grouping(物资编号)=1 then ''总计''

else ''(''+物资编号+'')''+物资名称 end

,供应数量=cast(sum(供应数量) as varchar)'+@s3+'

into #t

from 供应表

group by 物资编号,物资名称 with rollup

having grouping(物资名称)=0 or grouping(物资编号)=1

order by grouping(物资编号) desc

declare @i int

set @i=-1

update #t set @i=@i+1,序号=case when @i=0 then '''' else cast(@i as varchar) end

declare @ varchar(10)'+@s11+'

select '+@s12+'

'+@s13+'

exec('''+@s14+'+''

union all

select ''''序号'''',''''装备名称'''',''''合计'''''+@s2+'

union all

select * from #t

'')

drop table #

')

go

--删除测试

drop table 单位表,供应表

/*--测试结果(自己看)--*/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有