日期:2014-05-17  浏览次数:20868 次

求解决带参数的行列转换 sql case when 应用
各位高手,我有一个问题,想了几个月了,也没有有解决,请帮忙解决一下:
我有一个学生成绩表,是这样的:

create table score(--分数表
Id int identity(1,1),
stuId int ,--学生在班级序号,由任务产生
stuNo  nvarchar(12),--学号,由任务产生
stuName char(8),--由任务产生

deptId int,--部门代码
deptName nvarchar(20),--部门名称

classCourseNo nvarchar(40),--班级课编号,由任务产生
courseName nvarchar(50),--,--由任务产生
classId int,--班级编号
className nvarchar(30),--班级名称
termeId int ,--学期编号
termeName char(22),--学期名,由任产生
id2 nvarchar(22),--这是一个识别号,目的是在程序中,不重复写入


scorePingshi numeric(4,1) default(0.0),--平时成绩
scoreQiZhong numeric(4,1) default(0.0),--期中成绩
scoreQiMo numeric(4,1) default(0.0),--期末成绩
scoreZongping numeric(4,1) default(0.0),--总评成绩
bukao numeric(4,1) default(0.0),--补考


scoreXuefen nvarchar(5),--学分
scoreState nvarchar(10),--学生考试状态,也就是正常,缺考,作弊
empid int,--任课教师编号
empName nvarchar(8)--任课教师姓名
)

这个表的作用是把所有课程的所有学生的成绩放入其中,我们想按学期班级得到一个成绩汇总表:
先向表中加入数据:

insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1001','张三','语文','12机电1班','2012-2013学年第一期','89');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1001','张三','数学','12机电1班','2012-2013学年第一期','90');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1001','张三','电工基础','12机电1班','2012-2013学年第一期','98');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1001','张三','钳工训练','12机电1班','2012-2013学年第一期','78');

insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1002','李四','语文','12机电1班','2012-2013学年第一期','89');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1002','李四','数学','12机电1班','2012-2013学年第一期','90');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1002','李四','电工基础','12机电1班','2012-2013学年第一期','98');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1002','李四','钳工训练','12机电1班','2012-2013学年第一期','78');

insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1023','王五','体育','12机电2班','2012-2013学年第二期','89');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1023','王五','车床维修','12机电2班','2012-2013学年第二期','90');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1023','王五','电工基础','12机电2班','2012-2013学年第二期','98');
insert into score( stuNo,stuName,courseName,className, termeName,scorezongping)
values('1023','王五','书法','12机电2班','2012-2013学年第二期','78');



然后我建一个存储过程:这里有两个参数:
create procedure score_all(@class varchar(40),@terme varchar(40)) 
as  
 begin
 declare @sql varchar(8000) 
set @sql = 'select stuName as 姓名' 
select @sql = @sql + ' , max(case courseName when ''' + courseName + ''' then scoreZongping else 0 end) [' + courseName + ']' 
from (select distinct courseName from score) as a
 set&nb