`
逆风的香1314
  • 浏览: 1416392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟多级表头的分组统计

阅读更多

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

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

 

分享到:
评论

相关推荐

    QT的TableView实现多级表头

    标题“QT的TableView实现多级表头”指向的就是如何在`QTableView`中创建具有多个层次的表头。 在`QTableView`中实现多级表头,主要涉及到`QHeaderView`的自定义。`QTableView`的水平表头是`QHeaderView`的一个实例...

    poi多级表头导出模板

    poi多级表头导出模板

    poi多级表头导入模板

    poi多级表头导入模板

    jtable多级表头

    在实际应用中,我们有时需要展示更为复杂的数据结构,这时就需要用到多级表头(multiheader)。多级表头允许我们在表格的列或者行上设置多个层次的标题,以清晰地表示数据的分类和层次关系。 `JTable`本身并不直接...

    Java导出数据到Excel文件中(支持多表头)

    这里我们将深入探讨如何使用Java实现从数据库中查询数据并将其以多级表头的形式导入到Excel文件中。 首先,我们需要理解多级表头的概念。在Excel中,多级表头允许我们在工作表的列上设置多个层次的标题,以更清晰地...

    ext gridpanel多层表头分组小计导出excel与Java后台交互全代码

    该例子实现了ext的gridpanel多层表头+分组+小计以及与Java后台交互的全代码。还有自适应浏览器大小的功能包括导出excel,里面有注释,可能注释不全。分别为group.jsp,totals.jsp页面。

    cognos多级表头合并(视觉上)

    ### Cognos 多级表头合并(视觉上) 在Cognos环境下,处理复杂的报表时,经常会遇到需要创建多级表头的情况。这不仅是为了让数据展示更加清晰明了,也是为了提升用户体验。本文将详细介绍如何在Cognos中实现多级...

    递归实现ElementUI的多级表头

    在多级表头的场景中,递归可以用来处理层级关系,因为每个表头可能有子表头,这些子表头又可能有更下一级的表头,以此类推。递归可以自然地表示这种树形结构。 实现ElementUI的多级表头,我们需要以下步骤: 1. **...

    vue+element-ui动态生成多级表头的方法

    标题中的“vue+element-ui动态生成多级表头的方法”是指在Vue.js应用程序中使用Element-UI库来创建一个能够根据数据动态展示多级表头的表格组件。Element-UI是一个流行的前端UI框架,它提供了丰富的组件库,适用于...

    layui js 动态加载数据 复杂表头多表头实例.pdf

    Layui JS动态加载数据复杂表头多表头实例 Layui 是一个流行的前端框架,它提供了许多实用的组件和功能,其中表格组件是其中一个非常重要的组件。然而,在实际开发中,遇到复杂表头的需求是非常常见的,例如多表头、...

    基于Bootstrap table组件实现多层表头的实例代码

    Bootstrap Table多层表头实现实例代码 Bootstrap Table是一个功能强大的表格组件,它提供了许多有用的功能,包括多层表头的实现。在本文中,我们将分享基于Bootstrap Table组件实现多层表头的实例代码。 多层表头...

    复杂多表头excel表格的导出及布局,支持拓展

    要创建多级表头,可以先选定一级表头的范围,然后选择“插入”菜单中的“表”,在弹出的对话框中勾选“具有标题行”,并自定义表头。接着,对二级表头进行同样的操作,但要确保选择的范围只包括二级表头及其对应的列...

    poi 导出多表头

    在本场景中,我们关注的是如何使用 POI 来创建具有复杂表头的 Excel 导出功能。多表头通常指的是在 Excel 表格中拥有多个层次的列标题,这在处理分类数据或者构建具有嵌套结构的报告时非常有用。 ** poi 导出多表头...

    单表头以及多级表头excel导出

    单表头以及多级表头excel导出ExportExcel ex = new ExportExcel("XX表", "XX报表",jsonArray, jsonArrayObjects, keys, response);ex.export();

    C语言模拟多级反馈

    ### C语言模拟多级反馈队列调度算法 #### 背景介绍 多级反馈队列(Multilevel Feedback Queue, MFQ)是一种常见的进程调度算法,它通过将进程分配到不同优先级的队列中来提高系统的整体性能。本篇文章主要介绍了...

    Oracle分组统计

    这条语句将对 te 表中的数据进行多级分组统计,首先按照 t_project 和 t_dept 列进行分组,然后按照 t_dept 列进行分组,并对每个组进行 SUM(t_amount) 的聚合计算。 Grouping Sets 是一种功能强大且灵活的分组统计...

    实现jqGrid三级表头功能,支持冻结,拖动

    每个列对象可以包含一个`subgrid`属性,这个属性可以是一个对象,其中包含更多的列信息,形成多级结构。同时,我们还需要在HTML中创建对应的`&lt;thead&gt;`结构,确保每个单元格都正确地嵌套。 接下来,我们讨论冻结列的...

    vue+render+jsx实现可编辑动态多级表头table的实例代码

    根据给定文件信息,下面详细说明使用Vue.js框架结合render函数和JSX语法实现可编辑动态多级表头表格的知识点。 1. Vue.js框架基础: Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它允许开发者通过数据...

    自定义QTableView的表头QHeaderView实现多行表头

    2.TcTabelView支持设置多行横向表头(默认2行), 3.可以添加多张表格,每个表格是独立的,它们都有属于自己的自定义表头。 4.表头的右键操作我是自己写的,也可以用原例的方式,不过要复杂一点。 5.每一张表,一个tab,...

    多级表头Excel导入测试excel文件

    多级表头Excel导入测试excel文件

Global site tag (gtag.js) - Google Analytics