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

生成交叉表的简单通用存储过程

阅读更多

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_qry]
GO

/*--生成交叉表的简单通用存储过程
 
 根据指定的表名,纵横字段,统计字段,自动生成交叉表
 并可根据需要生成纵横两个方向的合计

 注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段
 如果不要此功能,则去掉交换处理部分

--邹建 204.06(引用请保留此信息)--*/

/*--调用示例

 exec p_qry 'syscolumns','id','colid','colid',1,1
--*/

create proc p_qry
@TableName sysname, --表名
@纵轴 sysname,  --交叉表最左面的列
@横轴 sysname,  --交叉表最上面的列
@表体内容 sysname, --交叉表的数数据字段
@是否加横向合计 bit,--为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar(4000),@sql varchar(8000)

--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
set @s='declare @a sysname
if(select case when count(distinct ['+@纵轴+'])from ['+@TableName+'])=1
 select @a=@纵轴,@纵轴=@横轴,@横轴=@a'
exec sp_executesql @s
 ,N'@纵轴 sysname out,@横轴 sysname out'
 ,@纵轴 out,@横轴 out

--生成交叉表处理语句
set @s='
set @s=''''
select @s=@s+'',[''+cast(['+@横轴+'] as varchar)+'']=sum(case ['+@横轴
 +'] when ''''''+cast(['+@横轴+'] as varchar)+'''''' then ['+@表体内容+'] else 0 end)''
from ['+@TableName+']
group by ['+@横轴+']'
exec sp_executesql @s
 ,N'@s varchar(8000) out'
 ,@sql out

--是否生成合计字段的处理
declare @sum1 varchar(200),@sum2 varchar(200),@sum3 varchar(200)
select @sum1=case @是否加横向合计
  when 1 then ',[合计]=sum(['+@表体内容+'])'
  else '' end
 ,@sum2=case @是否家纵向合计
  when 1 then '['+@纵轴+']=case grouping(['
   +@纵轴+']) when 1 then ''合计'' else cast(['
   +@纵轴+'] as varchar) end'
  else '['+@纵轴+']' end
 ,@sum3=case @是否家纵向合计
  when 1 then ' with rollup'
  else '' end

--生成交叉表
exec('select '+@sum2+@sql+@sum1+'
from ['+@TableName+']
group by ['+@纵轴+']'+@sum3)
go

 

分享到:
评论

相关推荐

    sqlserver 交叉表通用存储

    根据提供的信息,我们可以深入探讨SQL Server中的交叉表通用存储技术及其应用。交叉表查询是一种将行数据转换为列数据的方法,常用于报表处理等场景。接下来,我们将详细解析标题、描述以及部分代码所涉及的关键概念...

    一种通用的交叉表查询方法的实现.pdf

    ### 一种通用的交叉表查询方法的实现 #### 摘要 在信息系统开发过程中,交叉表查询是一个常见的问题。目前常用的查询方法包括通过特定的查询语句查询、由第三方报表组件直接生成以及创建临时表。然而,这些方法...

    MS-SQL报表生成的一种通用方法.pdf

    报表生成的最终结果是将基础表的数据以一种用户友好的形式展现,例如交叉表。这种表格可以通过行列互换的方式,清晰地展现不同数据维度的汇总信息。 结合上述知识点,可以总结如下几点: 1. 利用GROUP BY语句和聚合...

    经典SQL脚本大全

    │ │ 8.2.5 校验表中数据是否有循环编码的通用存储过程.sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例.sql ...

    PB数据窗口存储为PDF

    PB数据窗口是一个可视化工具,它允许开发人员创建各种类型的数据库报表,包括表格、图表、交叉表等。通过数据窗口,用户可以实现数据的查询、排序、过滤、更新等功能,同时提供丰富的外观定制选项。 2. **转换流程...

    Sqlserver2000经典脚本

    │ 8.1.4 生成编码规则调整处理T-SQL语句的函数.sql │ │ 8.1.5 删除节点处理的通用存储过程.sql │ │ 8.1.5 移动节点处理的通用存储过程.sql │ │ 8.2.2 树形数据层次显示处理示例.sql │ │ ...

    烘焙工具中用于生成法线贴图的切线空间的通用标准_c语言_代码_下载

    这个库遵循了一个通用的标准,允许外部程序(如3D建模软件或烘焙工具)与之交互,提供必要的接口来生成和处理切线空间数据。 总的来说,理解和实现切线空间的计算是3D图形编程中的重要技能,特别是在烘焙法线贴图时...

    access通用管理系统

    查询可以是选择查询、交叉表查询、参数查询、操作查询(如追加、更新、删除查询)或联合查询,帮助用户获取所需的信息。 3. **窗体**:是用户与数据库交互的界面。窗体可以包含多个控件,如文本框、复选框、列表框...

    初试水晶报表

    交叉表可以静态或动态地生成列,根据数据的变化调整布局。实现交叉表有两种常见方法:一是通过SQL在数据库端预先组织数据,然后以普通报表形式展示;二是直接利用水晶报表的内置功能来创建交叉表。对于非标准数据,...

    数据结构课程设计题集通用版.pdf

    这份"数据结构课程设计题集通用版.pdf"包含了一系列与数据结构相关的实践题目,旨在帮助学生深入理解和应用各种经典的数据结构。以下是对其中一些关键知识点的详细解释: 1. **Skip List**:跳表是一种概率性数据...

    基于MATLAB的四色地图自动生成.pdf

    主文件存储了空间数据,索引文件用于快速检索空间数据,而属性表文件则包含了与空间数据相对应的属性信息。由于其良好的通用性和标准性,SHAPE文件格式在GIS领域得到了广泛的应用。 5. 回溯算法的基本原理 回溯算法...

    通用数据查询与报表打印系统 asp.net

    这些工具能够帮助开发者创建复杂的数据报表,包括但不限于汇总、分组、过滤和交叉表。用户可以通过参数化查询,根据需求自定义筛选条件,从而获取所需的数据视图。报表设计界面支持拖放操作,使得非程序员也能快速...

    根据你的选择产生不同的交叉报表1.0

    在这个“根据你的选择产生不同的交叉报表1.0”项目中,我们可以推测这是一个Access数据库应用程序,利用了Access内置的交叉表查询功能,以及可能的VBA编程来实现用户交互和自定义报表生成。 Access是Microsoft ...

    2021年access浙江工商大学判断题题库有答案版.docx

    7. **交叉表查询**:交叉表查询可以显示来源于表中某个字段的总结值,且按一定的方式进行分组,一组列在数据表左侧,一组列在数据表上部。 8. **控件类型**:绑定型控件与未绑定型控件的区别在于,未绑定控件的数据...

    C#开发经验技巧宝典

    0907 SQL Server实现静态交叉表 529 0908 SQL Server实现动态交叉表 531 19.9 常用数据操作 532 0909 如何对字符串进行查询 532 0910 如何进行单条数据的添加 533 0911 如何进行批量数据的添加 533 0912...

    2021-2022计算机二级等级考试试题及答案No.2871.docx

    3. 交叉表查询:交叉表查询主要用于处理一对多关系中对“多方”的分组求和问题,因此选项A是正确的。它能够方便地对大量数据进行汇总和分析。 4. C++语言规范:C++程序中的注释可以跨越多行,但简单语句必须以分号...

Global site tag (gtag.js) - Google Analytics