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

面试时碰到一道题目,请高手看看
学生表st有两个字段ID,NAME
课程表kc有三个段:课程ID,学生ID,课程名name
一个学生可以选多个课程,查到是结果如下:
学生ID,课程name1,课程name2....

SQL怎么写啊~~~~~~~

------解决方案--------------------
如果要求未选课的学生记录不必显示出来:

declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',max(case when 课程名name= ' ' '+课程名name+ ' ' ' then 'Y ' else null end) as [ '+课程名name+ '] '
from 课程表kc
group by 课程名name

exec( 'select 学生ID '+@sql+ ' from 课程表kc group by 学生ID ')


如果要求未选课的学生记录也要显示出来:

declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',max(case when k.课程名name= ' ' '+课程名name+ ' ' ' then 'Y ' else null end) as [ '+课程名name+ '] '
from 课程表kc
group by 课程名name

exec( 'select s.ID as 学生ID '+@sql+ ' from 学生表st s left join 课程表kc k on s.ID=k.学生ID group by s.ID ')



------解决方案--------------------
declare @sql varchar(8000)
set @sql = 'select 学生ID, '
select @sql = @sql + 'max(case 课程名name when ' ' '+课程名name+ ' ' '
then source else 0 end) as ' ' '+课程名name+ ' ' ', '
from (select distinct 课程名name from 课程表kc) as a
select @sql = left(@sql,len(@sql)-1) + ' from 课程表kc group by name '
exec(@sql)
go