`
buliedian
  • 浏览: 1238444 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

通用动态交叉表的实现

阅读更多

-- ============================================================================
-- 通用动态交叉表的实现
-------------------------------------------------------------------------------
-- usp_Crosstab
-------------------------------------------------------------------------------

create PROCEDURE usp_Crosstab
@table varchar(50), --表名
@sumRow varchar(8000),--合计列字段
@groupRow varchar(1000), --分组列字段
@col varchar(50), --要将列值转换为列的列字段
@colTable varchar(1000),--要将列值转换为列的列字段表
@Sortfieldvarchar(100),--要将列值转换为列的列字段表排序字段
@content varchar(50), --列值转换为列后列的内容字段
@showSum varchar(50),--显示总计列名
@showSubtotal varchar(50),--显示小计列
@wherevarchar(8000)--查询条件
AS
DECLARE @declareSql varchar(8000), --变量定义的SQL
@initSql varchar(8000), --初始变量的SQL
@SubsectionSQL varchar(8000), --读取以4000分段后数据的SQL
@CombinationSQL varchar(8000), --分段后各个变量组合的SQL
@EndFromSQL varchar(8000), --组合的后辍(表名、分组列名)的SQL
@i int, --根据4000为分段迭代得到的i
@ic varchar(50), --转成字符串后的i
@mc varchar(50) --变量的个数


EXEC('select ID=Identity(int,1,1),COL=''sum(case '+@col+' when ''''''+'+@col+'+'''''' then '+@content+' else 0 end) as ''''''+'+@col+'+'''''','' ,GID=0,Sort= '+@Sortfield+' into ##tmp from (select '+@col+'=replace('+@col+','''''''',''''''''''''),'+@Sortfield+' from '+@colTable+')a')

SELECT @i=MAX(len(COL)) FROM ##tmp
SET @i=4000/@i

UPDATE ##tmp SET GID=ID/@i

SELECT @i=MAX(GID),@mc=cast(@i AS varchar(50)) FROM ##tmp
SELECT @declareSql='',@initSql='',@SubsectionSQL='',@CombinationSQL='',@EndFromSQL=''


WHILE @i>=0
BEGIN
SELECT @ic=cast(@i AS varchar(50)),@i=@i-1,@declareSql='@'+@ic+' as varchar(4000),'+@declareSql,@initSql='@'+@ic+'='''','+@initSql,
@SubsectionSQL='select @'+@ic+'=@'+@ic+'+COL from ##tmp where gid='''+@ic+''' order by sort '+char(13)+@SubsectionSQL,@CombinationSQL='@'+@ic+'+'+@CombinationSQL
END

SET @EndFromSQL=''' into ##CrossTable from '+@table+' where '+@where+' group by '+@groupRow+''''
SELECT @declareSql='declare '+left(@declareSql,len(@declareSql)-1)+char(13),@initSql='select '+left(@initSql,len(@initSql)-1)+char(13),@CombinationSQL=left(@CombinationSQL,len(@CombinationSQL)-1)
EXEC(@declareSql+@initSql+@SubsectionSQL+
'set @'+@mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+
'exec(''select '+@sumRow+',''+'+@CombinationSQL+'+'+@EndFromSQL+')'
)

EXEC('UPDATE ##CrossTable SET '+@showSum+' = ''总计'', '+@showSubtotal+' = null WHERE '+@showSum+' IS NULL ')

SELECT * FROM ##CrossTable
DROP TABLE ##tmp
DROP TABLE ##CrossTable

GO

分享到:
评论

相关推荐

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

    本文提出了一种基于Delphi组件技术的通用交叉表查询方法,并详细阐述了查询组件的实现机制。 #### 关键词 交叉表查询、组件技术、Delphi #### 1. 交叉表查询的基本原理 在开发管理信息系统的过程中,经常需要...

    sqlserver 交叉表通用存储

    给定的部分内容展示了如何通过SQL Server的存储过程实现动态交叉表的功能。下面将对这段代码进行逐行分析: ```sql CREATE PROC p_qry @TableNames sysname,-- @sysname,-- @sysname,-- @sysname,--ֶ @ǷӺϼ...

    SQL Server 交叉表查询 case

    此时,可以考虑使用动态SQL或SQL Server的PIVOT函数(从SQL Server 2005版本开始提供),后者允许你将列名作为变量传递,从而简化复杂的交叉表查询。 总的来说,虽然SQL Server不直接支持Access中的TRANSFORM语句,...

    基于单片机的通用控制器设计与实现

    本文讨论了如何基于单片机设计一个小型通用控制器,以在小型控制系统中替代传统的可编程逻辑控制器(PLC),并实现灵活性强、成本低的应用方案。在硬件设计方面,课题参考了主流PLC的体系结构,选用了ADuC841单片机...

    pivotmytable:PivotMyTable 是一个 PLPython PosgreSQL 函数,用于轻松构建数据透视表,为 PostgreSQL 扩展 tablefunc 中的交叉表函数生成正确的代码以使其工作

    PivotMyTablee以与其他可用解决方案相同的方式实现,自动创建tablefunc交叉表函数需要工作的查询。 此外, PivotMyTablee 可以直接获取透视表中的百分比,以及去除输出表中的空值。版权/许可PivotMyTable 由 Jorge ...

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

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

    pb11.5数据窗口通用库

    在PB11.5中,数据窗口通用库通常包含一系列预定义的数据窗口样式和模板,开发者可以根据项目需求选择合适的数据窗口类型,例如表格、分组、交叉表等。这些预定义的模板可以极大地提高开发效率,减少编码工作量。 总...

    基于ARM嵌入式系统的通用Bootloader的设计与实现

    ### 基于ARM嵌入式系统的通用Bootloader的设计与实现 #### 一、研究背景与意义 近年来,随着移动设备和技术的飞速发展,嵌入式系统已成为信息技术领域的一个重要分支。它不仅广泛应用于消费电子、通信网络、工业...

    润生通用查询分析系统

    系统允许用户通过SQL语句生成交叉表,实现数据的行列转换,便于数据分析和比较。 4. **图表展示**:除了基本的表格查询结果,润生系统还支持数据的可视化展示。用户可以将查询结果转化为饼图、柱状图等形式,直观地...

    基于PXA270的多功能仪器仪表通用平台

    多功能仪器仪表通用平台的设计目标是实现对多种数据采集、处理及显示功能的支持,同时具备良好的可扩展性和兼容性。基于PXA270处理器,该平台能够高效运行Windows CE 6.0操作系统,为各种复杂应用提供强大的计算能力...

    Grid++Report 报表设计器

    轻松实现通用报表、表格报表、动态报表、多层表头、票据与发票套打、交叉表、表中表及各种特殊报表等。提供详尽帮助文档与各种编程平台下的丰富例子,安装中包括可直接运行例子程序,安装后即刻体验此报表工具。包括...

    java模块级通用权限

    在实现通用权限模块时,需要关注安全性的几个方面: - 防止SQL注入:在处理用户输入时,应使用预编译语句或ORM框架的防止SQL注入机制。 - 权限隔离:确保不同模块的权限互不影响,避免权限交叉。 - 审计日志:记录...

    动态创建报表的五个类

    本文将深入探讨如何使用C#语言,通过五个关键类来实现动态创建基于rdlc格式的报表。rdlc报表是Microsoft .NET Framework中用于本地报告的一种格式,它允许开发者在应用程序中嵌入自定义的报告功能。 首先,我们来看...

    B/S结构下动态汇总报表的设计与实现

    在B/S架构下,为了实现动态汇总报表,需要考虑以下几个方面: - **用户界面设计**:设计直观易用的用户界面,让用户能够轻松选择汇总条件和汇总对象。 - **数据处理逻辑**:开发灵活的数据处理逻辑,支持多种维度的...

    Grid Report6.5

    Grid++Report 报表控件适用开发工具广泛:VB.NET、C#、VB、VC、Delphi、C++Builder等一切支持 COM 的开发工具。...轻松实现通用报表、表格报表、动态报表、多层表头、票据打印,发票套打、交叉表及各种特殊报表等。

    初试水晶报表

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

    access通用管理系统

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

    经典SQL脚本大全

    │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ │ │ └─其他 │ sp_cursor.sql │ 基本方法.sql │ ├─第08章 │ │ 8.1.2 树形数据分级汇总示例.sql │ │ 8.1.3 树形数据编号重排的通用存储过程.sql │ ...

    Grid++Report5.6

    轻松实现通用报表、表格报表、动态报表、多层表头、票据与发票套打、交叉表、表中表及各种特殊报表等。提供详尽帮助文档与各种编程平台下的丰富例子,安装中包括可直接运行例子程序,安装后即刻体验此报表工具。包括...

Global site tag (gtag.js) - Google Analytics