有学生表(编号,姓名,班级),成绩表(学生编号,科目编号,成绩) sql查询学生编号,姓名,科目成绩,没成绩的为0

科目有语文,数学,英语
2。查询每个班级各科目的平均成绩
1.查询学生编号,姓名,语文,数学,英语 没成绩的为0

1
select 学生表.编号,
姓名,
isnull(s1.语文成绩,0) as 语文成绩,
isnull(s2.数学成绩,0) as 数学成绩,
isnull(s3.英语成绩,0) as 英语成绩
FROM 学生表 left join
(select 学生编号, 科目, 成绩 as 语文成绩 from 成绩表 where 科目编号 = '语文') s1 on 学生表.编号 = s1.学生编号 left join
(select 学生编号, 科目, 成绩 as 数学成绩 from 成绩表 where 科目编号 = '数学') s2 on 学生表.编号 = s2.学生编号 left join
(select 学生编号, 科目, 成绩 as 英语成绩 from 成绩表 where 科目编号 = '英语') s3 on 学生表.编号 = s3.学生编号

2.
select 班级, 科目编号, avg(成绩) as 平均成绩 from 学生表, 成绩表 where 学生表.编号 = 成绩表.学生编号 group by 班级, 科目编号
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-03
selecct a.班级,b.科目编号,avg(isnull(b.成绩,0)) as 平均成绩
from 学生表 a join 成绩表 b on a.编号=b.学生编号
group by a.班级,b.科目编号追问

查询学生编号,姓名,语文,数学,英语 没成绩的为0

追答

selecct a.编号,a.姓名,case when 科目编号='语文' then b. avg(isnull(b.成绩,0)) end as 语文成绩,case when 科目编号='数学' then b. avg(isnull(b.成绩,0)) end as 数学成绩,case when 科目编号='英语' then b. avg(isnull(b.成绩,0)) end as 英语成绩
from 学生表 a join 成绩表 b on a.编号=b.学生编号
group by a.编号,a.姓名

成绩这个地方有疑问,如果一个学生一科有两个成绩,是取最小?最大?平均值?我这里用的是平均值,你可根据实际需要改,如果你编号、学科为主键保证不会重,那么用哪个都无所谓

追问

消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "student.id"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "sscore.sid"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "student.id"。
无法绑定由多个部分组成的标识符 "student.name"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "sscore.name"。

追答

不好意思,表别名没改

selecct a.编号,a.姓名,case when b.科目编号='语文' then avg(isnull(b.成绩,0)) end as 语文成绩,case when b.科目编号='数学' then avg(isnull(b.成绩,0)) end as b.数学成绩,case when b.科目编号='英语' then avg(isnull(b.成绩,0)) end as 英语成绩
from 学生表 a join 成绩表 b on a.编号=b.学生编号
group by a.编号,a.姓名

追问

消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'sscore.sname' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

追答

给哥你的sql语句行不?这么整受不了了

本回答被提问者采纳
第2个回答  2011-06-07
浙江省义乌市义亭镇中 姓名黄婷婷 QQ号码 手机号码

参考资料:浙江省义乌市义亭镇中

第3个回答  2011-06-03
是指表格的意思吗?感觉没弄懂
相似回答