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

原创 2004年06月25日 08:41:00

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

 

一个简单的oracle存储过程

在写这个存储过程的时候自己只是对存储过程有一个简答的编程理解,觉得应该和大多数编程语言没什么区别吧,就试试喽 先说说需求吧! 1、首先我需要获取表空间中的所有表名,并动态的去搜索遍历,所以不得不用...
  • woyizhidouzai0505
  • woyizhidouzai0505
  • 2016年08月18日 11:00
  • 653

sql通用存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 ...
  • mycomputerxiaomei
  • mycomputerxiaomei
  • 2014年12月16日 15:49
  • 453

用SQL语句获得一个存储过程返回的表

定义一个存储过程如下: create proc [dbo].[test1] @id int as select 1 as id,'abc' as name union all  select...
  • studyzy
  • studyzy
  • 2013年09月10日 14:19
  • 5572

SQL动态生成交叉表应用范例

交叉表的应用较为丰富,应用的方式与范围也是十分丰富。
  • qiushuisen
  • qiushuisen
  • 2014年10月17日 07:26
  • 1121

sql存储过程几个简单例子(一)

导读:sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解。 例1: ...
  • imxiangzi
  • imxiangzi
  • 2015年01月18日 09:44
  • 2022

关于mysql存储过程创建动态表名及参数处理

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  最近游戏开始第二次内测,开始处理操作日志,最开始把日志放到同一个表里面,发现一天时间,平均100玩家在线...
  • ycg514230
  • ycg514230
  • 2014年11月16日 20:36
  • 5802

给存储过程传递一个表(XML运用)

http://www.sqlservercentral.com/articles/Stored+Procedures/2977/ By Jacob Sebastian, 2007/0...
  • u012992506
  • u012992506
  • 2014年05月15日 10:49
  • 958

用存储过程批量更新表

最近做了一个需求,需要批量更新数据库表,但是因为涉及到的数据较多(千万条),如果直接用sql更新,估计会把pl/sql弄垮 sql如下:update online_product set online...
  • zdp072
  • zdp072
  • 2015年01月29日 09:28
  • 2389

通用分页存储过程的使用

看着同事写的通用分页存储过程觉得还不错,分享给大家 1、存储过程 USE [test] GO /****** Object:  StoredProcedure [dbo]....
  • f10_s
  • f10_s
  • 2013年09月10日 16:35
  • 1341

通用数据表整理

1. 系统类别代码表 - 通常应用于下拉列表等基础信息   1.1 类别代码表定义 CREATE TABLE [dbo].[SysTypeCode]( [Code] [varchar](3) N...
  • CsethCRM
  • CsethCRM
  • 2015年03月31日 09:36
  • 448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生成交叉表的简单通用存储过程
举报原因:
原因补充:

(最多只允许输入30个字)