求解决带参数的行列转换 sql case when 应用解决办法

求解决带参数的行列转换 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 @sql = @sql + 'from score where (className='''+@class +''' and  termeName='''+@terme+''') group by stuName ' 
--print @sql 
exec(@sql) 
end

我想得到 12机电1班,  2012-2013学年第一期  有成绩汇总,
执行:
exec  score_all @class='12机电1班',@terme='2012-2013学年第一期'

结果却是这样的,这该出现的东西出现了,如车床维修、书法、体育等课不是这个班的,也是不这人学期的,去出在这人表上,请高手帮忙解决一下。

 




------解决方案--------------------

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 score
where className = @class and termeName = @terme
group by courseName
 set @sql = @sql + 'from score where (className='''+@class +''' and  termeName='''+@terme+''') group by stuName ' 
--print @sql 
exec(@sql) 
end
--try !!!

------解决方案--------------------
注意两个参数为NULL的情况,在对动态SQL语句组合的时候注意下条件的判断和控制。