我想让SQLSERVER2000自己做行列转置的问题,应该如何操作 (怎样用存储过程实现行列转换)

举个例子,比如成绩单
对于每个学生来讲可能所学的科目不一样于是定义了一张表存放该学生所学的科目及成绩但最后我要的表格是横向的,即:
学生编号 科目 成绩
1 语文 100
1 数学 99
2 外语 98
2 数学 97

姓名 语文 数学 外语 ...
1 100 99
2 97 98
....
请问该如何写触发器和存储过程?

---------------------------------------------------------------
我写的一个简单的交叉制表存储过程:
--交叉制表(Myself)
CREATE PROCEDURE sp_makeCrosstab (
@tablename as varchar(50),
@namefield as varchar(50),
@typefield as varchar(50),
--@typefield 所取的字段的数据不能为数字型,否则出错,
--可以将最后一句 N' else 0 end) as ' + rtrim(@Temp) 改为N' else 0 end) as A' + rtrim(@Temp),即加一个固定的字符。
@valuefield as varchar(50)
)
AS
DECLARE @Temp varchar(20)
DECLARE @SqlString varchar(500)
DECLARE @strCursor varchar(500)

SET @SqlString = N'select ' + @namefield

--动态建立游标
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 + N' GROUP BY ' + @namefield

EXEC (@Sqlstring)
调用:
exec sp_makeCrosstab '成绩单','学生编号','科目','成绩'

希望对你有帮助。

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