一条SQL语句的困惑

staticuser 2009-11-28 04:23:54
一条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语句,,,,,等待解决。。
...全文
257 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
staticuser 2009-11-30
  • 打赏
  • 举报
回复
顶啊。。
sunkezai 2009-11-29
  • 打赏
  • 举报
回复
交叉表啊
happyer_longlong 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sundotlei 的回复:]
动态读取科目
SQL code--临时表对应实体表
--#A Student
--#B Score
--#C Subjectdeclare@sqlvarchar(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*/
[/Quote]
这 已经挺好的了 回头整
daima222 2009-11-28
  • 打赏
  • 举报
回复
顶上
huangfeillq 2009-11-28
  • 打赏
  • 举报
回复
学习
jmd25 2009-11-28
  • 打赏
  • 举报
回复
关注!
oneatree 2009-11-28
  • 打赏
  • 举报
回复
mark
staticuser 2009-11-28
  • 打赏
  • 举报
回复
再顶,一定要有个满意的答案啊
longhair9711 2009-11-28
  • 打赏
  • 举报
回复
关注!!!!!
staticuser 2009-11-28
  • 打赏
  • 举报
回复
我需要答案,,,,
staticuser 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sundotlei 的回复:]
动态读取科目
SQL code--临时表对应实体表
--#A Student
--#B Score
--#C Subjectdeclare@sqlvarchar(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*/
[/Quote]

要的就是这样的,动态读取科目,但是我想在一条SQL语句中实现,怎么办?期待更好的答案……
tianliang1 2009-11-28
  • 打赏
  • 举报
回复
学习
sundotLei 2009-11-28
  • 打赏
  • 举报
回复
动态读取科目

--临时表对应实体表
--#A Student
--#B Score
--#C Subject

declare @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 c

set @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

*/
sundotLei 2009-11-28
  • 打赏
  • 举报
回复

--#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
*/
蓝点天尊 2009-11-28
  • 打赏
  • 举报
回复
行列转换楼上说的是对的
flyfly2008 2009-11-28
  • 打赏
  • 举报
回复

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 姓名
qqzeng-ip 2009-11-28
  • 打赏
  • 举报
回复
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
from tb
group by 姓名


自己根据两个表来
staticuser 2009-11-28
  • 打赏
  • 举报
回复
我顶。。。,。,

111,121

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧