lz的表设计得不够规范啊,产生了大量的数据冗余,
你是想用一张表保存学生的信息和对应课程的分数记录
但是这样一来,一旦一名学生有两门以上的课程时,学生姓名学号等基本信息字段就会重复,必然产生冗余。。。
正确的做法是,建立两张表,一张是学生信息表,一张是学生成绩表
两个表之间用学生学号进行关联,然后再来查询,
以lz给出的图为例:
student表:
字段名 字段含义
snum 学号
sname 姓名
ssex 性别
smajor 所属专业
score表:
snum 学号
cnum 课程号
grade 得分
查询语句:
select a.*,b.avg from student a,(select distinct(c.snum),avg(c.grade) as avg from score c group by c.snum) b where a.snum=b.snum
只算平均分吗?不考虑是否大于80吧。
select Student.*,t1.CNum,t1.Grade,(select Avg(Grade)
from SC t2
where t2.SNum=t1.SNum and Avg(Grade)>=80) as 平均分
from Student,SC t1
where
t1.SNum=Student.SNum
你说的是平均分不大于80的学生就不列出来吗?
还是平均分低于80的学生就不显示平均分了?
我估计你说的是前者
select Student.*,t1.CNum,t1.Grade,(select Avg(Grade)
from SC t2
where t2.SNum=t1.SNum group by t2.SNum having Avg(Grade)>=80) as 平均分
from Student,SC t1
where
t1.SNum=Student.SNum
这个显示的是所有学生的所有成绩,如果平均分大于80,就显示平均分,小于就不显示平均分。
如果你只要平均分大于80的学生的信息的话:
select Student.*,t1.CNum,t1.Grade,(select Avg(Grade)
from SC t2
where t2.SNum=t1.SNum) as 平均分
from Student,SC t1
where t1.SNum=Student.SNum
and (select Avg(Grade) from SC t2
where t2.SNum=t1.SNum
and group by t2.SNum)>=80
不知道你是否会要大于80分的学习的姓名啊,就是不要每科的分数,只要姓名。
先创建两个视图~~在用下左链接~~create view view1 as (select Student.*,SC.CNum,SC.Grade
from Student,SC
where
SC.SNum=Student.SNum)
go
create view view2 as (select SC.SNum,Avg(Grade)
from SC
group by SNum
having Avg(Grade)>=80)
go
select * from view1 as v1 left outer jion view2 as v2 on v1.SNum = v2.SNum
代码参考如下:
select isnull(a.unit,b.fine_units) unit,isnull(a.number,0) number,isnull(b.fine_number,0) fine_number
from (第一个SQL) A FULL JOIN (第二个SQL) b on a.unit=b.fine_units。