一条SQL语句的困惑
现有学生表(Student):StuID(自动增长,学生ID),Name(学生姓名)
成绩表(Score):ID(自动增长),StudentId(学生表外键),Score(分数),SubID(科目编号)
科目表(Subject):SubID(自动增长,科目编号,Score表外键),SubName(科目名称)
数据如下:
Student表
StuID Name
1 张三
2 李四 Score表
ID StudentID Score SubID
1 1 86 1
2 2 80 1
3 1 92 2 Subject表
SubID SubName
1 语文
2 数学现在想得到这样的结果:
查询所有学生考试,然后把科目名称当做列名显示:ID Name 语文 数学
1 张三 86 93 这里把科目表的字段当做列名,如何修改
求一条SQL语句,,,,,等待解决。。
现有学生表(Student):StuID(自动增长,学生ID),Name(学生姓名)
成绩表(Score):ID(自动增长),StudentId(学生表外键),Score(分数),SubID(科目编号)
科目表(Subject):SubID(自动增长,科目编号,Score表外键),SubName(科目名称)
数据如下:
Student表
StuID Name
1 张三
2 李四 Score表
ID StudentID Score SubID
1 1 86 1
2 2 80 1
3 1 92 2 Subject表
SubID SubName
1 语文
2 数学现在想得到这样的结果:
查询所有学生考试,然后把科目名称当做列名显示:ID Name 语文 数学
1 张三 86 93 这里把科目表的字段当做列名,如何修改
求一条SQL语句,,,,,等待解决。。
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
from tb
group by 姓名自己根据两个表来
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
from
(select a.Name,b.Score ,c.SubName from Student a ,Score b ,Subject c where a.StuID=b.StudentID )
b.SubID =c.SubID)
group by 姓名
--#A Student
--#B Score
--#C Subject
select 姓名=max(name),语文=max(case subname when '语文' then score end),数学=max(case subname when '数学' then score end) from (select a.name,b.score,c.subname from #A a left join #B b on a.stuid=b.stuid inner join #C c on b.subid=c.subid) A group by name/*
姓名 语文 数学
-------------------------------------------------- ----------- -----------
李四 80 NULL
张三 86 92
*/
--#A Student
--#B Score
--#C Subjectdeclare @sql varchar(8000)set @sql='select max(name) Name'
select @sql=@sql+','+c.subname+'=max(case subname when '''+c.subname+''' then score end)'
from #C cset @sql=@sql+' from (select a.name,b.score,c.subname from #A a left join #B b on a.stuid=b.stuid inner join #C c on b.subid=c.subid) A group by name'exec (@sql)/*Result:
姓名 语文 数学
-------------------------------------------------- ----------- -----------
李四 80 NULL
张三 86 92*/
要的就是这样的,动态读取科目,但是我想在一条SQL语句中实现,怎么办?期待更好的答案……