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

存储过程

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时在交叉表纵向最下边加纵向合计asdeclare @s nvarchar(4000),@sql varchar(8000)

--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段set @s='declare @a sysnameif(select case when count(distinct ['+@纵轴+'])<count(distinct ['+@横轴+']) then 1 else 0 endfrom ['+@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

 

时间: 2024-08-22 11:05:31

生成交叉表的简单通用存储过程的相关文章

复制表结构的通用存储过程

复制表结构的通用存储过程 --Transfer对象的重要属性 --1.属性 属性名 类型 描述 ------------------------------------------------------------------------ CopyAllDefaults Boolean 所有默认值 CopyAllObjects Boolean 所有对象 CopyAllRules Boolean 所有规则 CopyAllStoredProcedures Boolean 所有存储过程 CopyAl

Oracle动态交叉表生成_oracle

正在看的ORACLE教程是:Oracle动态交叉表生成.Oracle是应用最广的大型数据库,而在范式下进行Oracle数据库设计则可以大大减少数据冗余,使数据库维护更方便,可惜范式下的数据表一般不能直接输出.今天我们就来探讨一下范式下的数据表的动态交叉表生成的方法. 范式下的Oracle数据库设计 数据关系的复杂性导致了表中数据冗余的存在,数据冗余增加了维护数据库的负担,也占用了大量的磁盘空间,直接造成性能下降.为了消除这些负面影响,就应该对数据库表格进行规范化,使其遵守一定的规则的,尤其是数据

SQL实现动态交叉表

动态交叉表就是列表可以根据表中数据的情况动态创建列. 动态查询不能使用Select语句实现,它可以利用存储过程实现.思路是: 首先检索列头信息,形成一个游标,然后遍历游标,将上面静态交叉表实现过程中使用Case语句判断的内容用游标里的值替代,形成一条新的Sql查询语句,然后执行并返回结果.下面是一个通用的实现动态交叉表的存储过程: CREATE procedure proc_across_table @TableName as varchar(50), --生成交叉表依据的表名 @NewColu

Delphi中建立交叉表

function CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet; var TempTable:TatClientDataSet; begin TempTable:=nil; Result:=nil; if AFieldDefs<>nil then begin try TempTable:=TatClientDataSet.Create(Application); TempTable.FieldDefs.Assign(AFieldDefs)

sql生成(c#调用存储过程返回数据表)代码的存储过程

GO /****** 对象: StoredProcedure [dbo].[pro_GenerateServiceFunction] 脚本日期: 08/04/2012 11:26:43 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pro_GenerateServiceFunction]') AND type in (N'P', N'PC')) DROP PROCEDURE [d

SQL存储过程实现SPSS交叉表

  SP代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

Mysql5 实现交叉表查询

交叉表.行列转换和交叉查询经典 一.什么是交叉表 "交叉表"对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: 行 列 摘要字段 "交叉表"中的行沿水平方向延伸(从一侧到另一侧).在上面的示例中,"手套"(Gloves) 是一行. "交叉表"中的列沿垂直方向延伸(上下).在上面的示例中,"美国"(USA) 是一列. 汇总字段位于行和列的交叉

通用存储过程的编写

存储过程 通用存储过程的编写 对数据库的操作基本上就四种:Insert.Update.Delete和Select,而Update和Insert两种操作又可以作简单的合并,这样下来,基本上一个数据表对应三个存储过程便可以完成绝大多数的数据库操作.存储过程命名规则:Operate_TableName.比如表Order_Info对应三个存储过程:AddEdit_Order_Info.Delete_Order_Info.Search_Order_Info,下面先列出相关代码,然后作总体分析. 一.Add

SQL交叉表实例

版权声明:CSDN是本Blog托管服务提供商.如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决. SQL交叉表实例 很简单的一个东西,见网上好多朋友问"怎么实现交叉表?",以下是我写的一个例子,数据库基于SQL SERVER 2000. -- ====================================================== --交叉表实例 -- ==========================================