一个通用的交叉制表存储过程
原作者 :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
( SELECT *
FROM sysobjects
WHERE name = @chrSource
AND type IN ('v','u'))
BEGIN
RAISERROR 51001 'Source does not exists.'
RETURN -1
END
/* Check for column existence */
IF NOT EXISTS
( SELECT sc.name
FROM syscolumns sc
JOIN sysobjects so ON sc.id = so.id
WHERE so.name = @chrSource
AND sc.name = @chrColHead)
BEGIN
RAISERROR 51002 'Invalid @chrColHead name.'
RETURN -1
END
IF NOT EXISTS
( SELECT sc.name
FROM syscolumns sc
<sp