模拟多级表头的分组统计

分组|统计

原帖地址:
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 单位表,供应表

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

 

时间: 2024-09-18 08:46:53

模拟多级表头的分组统计的相关文章

【案例分享】电力设备生产数据的多层分组统计报表实现

多层分组统计报表即按照不同的数据字段,形成多级分组,并分层级进行合计. 传统报表的实现方式大多基于 Table 控件,虽然可实现多个分组功能,但在报表显示方面有限制,只能呈现上下级的分组,而现代的复杂报表的需求,通常是左右级嵌套,有时甚至要求相同内容的单元格合并,使用 Table 控件,有太多的局限,有了矩表控件,通过简单的拖拽就能轻松实现多层分组报表,不管有多少个分组和分组小计都能简单解决. 下面会通过一个具体的案例,使用葡萄城报表中的矩表控件来讲解实现多层分组统计报表.   (一)原始数据

分组统计方法:用Group By

分组|统计 原贴:http://community.csdn.net/Expert/topic/3739/3739565.xml?temp=.7632105表中三个字段|---------------------------------------------||  产品             数量                单价  ||=============================================||  A                3          

实现按部门月卡余额总额分组统计的SQL查询代码

分组|统计 陈优章的专栏 (原创,到现在为至最为复杂的SQL查询代码)实现按部门月卡余额总额分组统计的SQL查询代码(在Ms SQL Server中调试通过) SELECT dp.dpname1 AS 部门, cust_dp_SumOddfre.sum_oddfare AS 当月卡总余额FROM (SELECT T_Department.DpCode1, SUM(custid_SumOddfare_group.sum_oddfare)               AS sum_oddfare  

Access中分组统计的实例

access|分组|统计 Access中分组统计的实例 整理自:http://expert.csdn.net/Expert/topic/2727/2727523.xml?temp=.1140711 online 表下有字段: 描述:用户名 版本 是否注册 字段:usr_name ver isreg 现表中有以下记录: aaa cn true bbb cn false ccc en true ddd fr true 结果要求:查询每个版本的注册用户和未注册用户的数目,得出如下结构: 版本 注册数量

浅谈分组统计

在现实生活中,分组统计是很常用的.例如人民银行要求商业银行报送的反洗钱报表中就有一个项目是当月发生的大额交易的笔数和金额, 其中大额交易定义为某个客户的当日累计发生额在人民币20万元或者外币等值1万美元以上.这样就要从大量的交易流水账中按交易日期进行分 组统计. 让我们来生成要统计的数据,如下所示: IEnumerable<Tuple<int, double>> GetTuples(int n) { var tuples = new Tuple<int, double>

SQL的排序,分组,统计常用语句

  SQL的排序,分组,统计常用语句: 1.使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个分组时排序的结果,并不是真的分组.ORDER BY显示每条记录而分组可能代表很多记录. 2.进行分组除去重复值 排序和分组之间的最大区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录.GROUP BY语句对于同样的值只显示一条记录.例如,下面的语句中的GRO

《卸甲笔记》-分组统计查询对比之二

13在分组查询的SELECT子句中出现其他字段(ename) Oracle SQL> select deptno,ename,COUNT(empno) 2 from emp 3 GROUP BY deptno; select deptno,ename,COUNT(empno) * ERROR at line 1: ORA-00979: not a GROUP BY expression PPAS scott=# select deptno,ename,COUNT(empno) scott-# f

lucene分组统计-lucene的分组统计怎么弄

问题描述 lucene的分组统计怎么弄 怎么或许到文档数据,然后分组统计出来,这几天一直在郁闷这个, 解决方案 http://blog.163.com/liugangc@126/blog/static/20374821201011313238137/

Lucene5学习之Group分组统计

 Group即分组,类似SQL里的group by功能,Lucene中分组是通过内置的几种Collector结果集收集器实现的,有关group的结果集收集器都在org.apache.lucene.search.grouping包及其子包下,  包含group关键字的Collector都是有关Group分组的结果收集器,如果你只需要统计如下这些分组信息: Java代码   /** 所有组的数量 */   int totalGroupCount = 0;   /** 所有满足条件的记录数 */