一个通用的交叉制表存储过程

一个通用的交叉制表存储过程

原作者 :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

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus