USE [rhxsgl]
GO
![]()
/**//****** 对象: StoredProcedure [dbo].[dt_sp_makeCrosstab] 脚本日期: 08/02/2007 15:52:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,李永强>
-- Create date: <Create Date,,2007年8月1日18:09:16>
-- Description: <Description,,制作交叉表>
-- =============================================
![]()
/**//*
交叉制表
*/
CREATE PROCEDURE [dbo].[dt_sp_makeCrosstab](
@tablename as varchar(50), --来源的表表名或者视图名
@namefield as varchar(400), --固定显示的列集合,在这里不能使用as关键字
@typefield as varchar(50), --要将字段值变为列的字段,字段值内不的包含+或者&字符,否则会报错
--@typefield 所取的字段的数据不能为数字型,否则出错,
--可以将最后一句 N' else 0 end) as ' + rtrim(@Temp) 改为N' else 0 end) as A' + rtrim(@Temp),即加一个固定的字符。
@valuefield as varchar(50),--查询的数据,数值列
@sqlwhere as varchar(200) --查询的条件语句,要求带有where
![]()
)
AS
DECLARE @Temp varchar(20)
DECLARE @SqlString varchar(500)
DECLARE @strCursor varchar(500)
![]()
SET @SqlString = N'select ' + @namefield
set @sqlwhere=N' '+@sqlwhere
--动态建立游标
SET @strCursor ='DECLARE cuTemp CURSOR FOR SELECT DISTINCT '
+ @typefield + ' FROM ' + @tablename
EXEC (@strCursor)
![]()
OPEN cuTemp
FETCH NEXT FROM cuTemp into @Temp
![]()
WHILE @@Fetch_Status = 0
BEGIN
SET @Sqlstring = @SqlString + N',SUM(case when ' + @typefield + N'='''+ rtrim(@Temp)
+ N''' then ' + @valuefield + N' else 0 end) as ' + rtrim(@Temp)
FETCH NEXT FROM cuTemp into @Temp
END
![]()
CLOSE cuTemp
DEALLOCATE cuTemp
![]()
SET @Sqlstring = @SqlString + N' FROM ' + @tablename +@sqlwhere+ N' GROUP BY ' + @namefield
![]()
EXEC (@Sqlstring)
这个过程还有不断完善的过程不过已经可以使用了,对于简单的情况。
同样的实现可以参考这位仁兄的帖子
http://www.cnblogs.com/Jinglecat/archive/2007/05/23/756427.html 写的不错。他还有
交叉表的简单实现2:使用前端程序实现 可以看看参考