在SQL 中实现行变列的存储过程

 

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:使用前端程序实现 可以看看参考

你可能感兴趣的:(存储过程)