一个通用的交叉制表存储过程
原作者:John Papa, Matthew Shepker 1999
整理: 水如烟(http://blog.csdn.net/lzmtw) 2005-5-1
示例:
Use pubs
GO
exec prCrosstab 'stor_id','ord_date','qty','sales',1,5
结果:
RowHead |
Year_1992 |
Year_1993 |
Year_1994 |
6380 |
0 |
0 |
8 |
7066 |
0 |
50 |
75 |
7067 |
80 |
0 |
10 |
7131 |
0 |
85 |
45 |
7896 |
0 |
60 |
0 |
8042 |
0 |
55 |
25 |
以下为生成脚本:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[prCrosstab]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[prCrosstab]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
/*
功能:交叉制表
参数 描述
@chrRowHead 表示列,在交叉制表的结果中作为第一出现
@chrColHead 表示列,在交叉制表的结果中该列中的数据被变换为新列名称
@chrValue 表示列,在该列中执行聚合函数
@chrSource 源表或视图
@inyType 1-求和,2-平均值,3-最小值,4-最大值,5-计数
@inyGrouping 1-工作日,2-年内的周数,3-月份,4-季度,5-年份
Author:John Papa Matthew Shepker
整理: 水如烟(http://blog.csdn.net/lzmtw)
日期: 5-1-2005
*/
CREATE PROCEDURE prCrosstab
@chrRowHead char(30),
@chrColHead char(30),
@chrValue char(30),
@chrSource char(30),
@inyType tinyint=1,
@inyGrouping tinyint=0
AS
/* Variables for the procedure */
DECLARE
@chvRow varchar(255),
@chvCol varchar(255),
@chvVal varchar(255),
@chvType varchar(10),
@chvRowType varchar(10),
@chvColType varchar(255),
@chvTemp varchar(255),
@chvColTemp varchar(255),
@chvRowTemp varchar(255),
@intType int,
@intRowType int,
@intColType int,
@chvExec varchar(255),
@chvGroup varchar(255),
@fltTemp float,
@dtmTemp datetime,
@insR smallint,
@intColumn int,
@intReturn int,
@intTemp int,
@intColNameLen int,
@intMaxRowHead int
SET NOCOUNT ON
/* Check if source exists */
IF NOT EXISTS