日期:2014-05-18  浏览次数:20810 次

我认为这个题有点难度
3个表
一个学生表(学生号(stid),学生名(stname))
课程表(课程号(scid),课程名称(scname),)
成绩表(成绩(fcchj),课程号(fcid),学生号(fcid)
要求查寻出下面的结果
姓名           英语           语文           数学
张               79               80                 50
孙               80               47                 48

------解决方案--------------------
--如果课程是固定的
Select
B.stname As 姓名,
SUM(Case C.scname When '英语 ' Then A.fcchj Else 0 End) As 英语,
SUM(Case C.scname When '语文 ' Then A.fcchj Else 0 End) As 语文,
SUM(Case C.scname When '数学 ' Then A.fcchj Else 0 End) As 数学
From
成绩表 A
Inner Join
学生表 B
On A.stid = B.stid
Inner Join
课程表 C
On A.scid = C.scid
Group By
B.stname

--如果课程不是固定的
Declare @S Varchar(8000)
Select @S = 'Select B.stname As 姓名 '
Select @S = @S + ', SUM(Case scname When ' ' ' + scname + ' ' ' Then fcchj Else 0 End) As ' + scname
From 课程表 Group By scname
Select @S = @S + ' From 成绩表 A Inner Join 学生表 B On A.stid = B.stid Inner Join 课程表 C On A.scid = C.scid Group By B.stname '
EXEC(@S)
------解决方案--------------------
declare @S varchar(1000)
set @s= ' '
select @s=@s+ ',sum(case scname
when ' ' '+scname+ ' ' ' then fcchj else 0 end) as '
+ scname from 课程表 group by scname

select @s= 'select stname as 姓名 '+@s+ 'from 学生表 a
inner join 成绩表 b on a.stid=b.fcid
inner join 课程表 c on c.scid=b.fcid
group by stname '

exec(@s)