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