我想获得FIRSTNAME
的{{1}}和LASTNAME
,这些已经在2010年之后开始,并且所有学科的平均成绩都高于5.50。年份为整数(4)成绩道具为 - null(尚未完成),0(未参加考试)和2,3,4,5,6。
数据库:Oracle
我在尝试的是:对于每个STUDENT
大于2010年的学生,获得他的成绩的平均值,除了那些为零或零的成绩。
我尝试过的代码:
YEARSATART
我猜我的查询错了,因为我看不到正确的结果。您对改进/修复有什么想法吗?哪里可能是我的错?我觉得我得到了所有年级的平均分,而不是每个学生分别
答案 0 :(得分:2)
我认为你只是错过了subselect的位置。您需要在Studentst = Student.StudentID:
的classstudent上进行过滤SELECT DISTINCT FIRSTNAME, LASTNAME FROM PERSON
JOIN STUDENT ON PERSON.PERSONID = STUDENT.STUDENTID
JOIN CLASSSTUDENT ON STUDENT.STUDENTID = CLASSSTUDENT.STUDENTID
WHERE STUDENT.YEARSTART > 2010
AND (SELECT AVG(FINALGRADE)
FROM CLASSSTUDENT
WHERE FINALGRADE IS NOT NULL
AND FINALGRADE > 1
AND STUDENTID=STUDENT.STUDENTID) >= 4.50;
答案 1 :(得分:0)
您需要将嵌套查询加入外部查询,最好将alias
设置为每个表以允许消除歧义。此外,您不需要CLASSSTUDENT
主查询:
SELECT DISTINCT FIRSTNAME, LASTNAME
FROM PERSON
JOIN STUDENT S ON PERSON.PERSONID = S.STUDENTID
WHERE STUDENT.YEARSTART > 2010
AND (SELECT AVG(FINALGRADE)
FROM CLASSSTUDENT C
WHERE C.STUDENTID = S.STUDENTID
AND FINALGRADE > 1) >= 4.50;
在嵌套查询中也不是null,因为聚合函数不计算空值。