上面的AVG子查询返回没有结果

时间:2013-10-18 00:43:13

标签: sql oracle subquery average

我想获得一份在期末考试中取得高于平均水平的学生名单

我首先选择获得平均值

SELECT w.LAST_NAME , AVG(s.NUMERIC_GRADE) AS NUMERIC_GRADE 
GRADE s , SECTION z, STUDENT w
WHERE s.SECTION_ID = z.SECTION_ID AND s.STUDENT_ID = w.STUDENT_ID
AND s.SECTION_ID = 90 AND s.GRADE_TYPE_CODE = 'FI'
GROUP BY w.LAST_NAME,s.NUMERIC_GRADE

我得到了这四个结果

LAST_NAME                 NUMERIC_GRADE
------------------------- -------------
Mulroy                               83 
Da Silva                             92 
Lopez                                91 
Abid                                 84 

但是当我尝试从这四个中得到上述平均值时,我没有得到任何行,看起来子查询和主查询具有相同的条件。我不确定在avg之后如何做。

SELECT n.LAST_NAME , m.NUMERIC_GRADE 
FROM GRADE m , STUDENT n
WHERE m.STUDENT_ID = n.STUDENT_ID
GROUP BY n.LAST_NAME , m.NUMERIC_GRADE
HAVING COUNT(*) >
(SELECT AVG (NUMERIC_GRADE)
FROM
(SELECT w.LAST_NAME , AVG(s.NUMERIC_GRADE) AS NUMERIC_GRADE 
FROM GRADE s , SECTION z, STUDENT w
WHERE s.SECTION_ID = z.SECTION_ID AND s.STUDENT_ID = w.STUDENT_ID
AND s.SECTION_ID = 90 AND s.GRADE_TYPE_CODE = 'FI'
GROUP BY w.LAST_NAME,s.NUMERIC_GRADE))

ORDER BY n.LAST_NAME;

我想获得numberic_grade 91和92,因为它高于平均水平。当我试图选择那些在期末考试中具有高于平均水平的人时,为什么它没有给我任何行?

1 个答案:

答案 0 :(得分:1)

您的查询存在以下问题:

  • 您还需要在第一个AVG查询中使用GROUP BY
  • 您需要使用与内部查询相同的条件限制顶部查询(即成绩类型代码和部分ID)
  • 您不需要加入部分,因为您正在限制其ID,可从GRADE
  • 获取
  • 应该使用至少与表名略有相似的别名:它对提高可读性有很大帮助
  • 应使用ANSI连接以提高可读性

尝试使用这些更正的查询:

SELECT n.LAST_NAME , AVG(m.NUMERIC_GRADE)
FROM GRADE g
JOIN STUDENT s ON g.STUDENT_ID = s.STUDENT_ID -- Use ANSI joins
WHERE g.SECTION_ID = 90 AND g.GRADE_TYPE_CODE = 'FI'
GROUP BY s.LAST_NAME
HAVING AVG(g.NUMERIC_GRADE) >
   (SELECT AVG(NUMERIC_GRADE)
      FROM (
        SELECT AVG(g.NUMERIC_GRADE) AS NUMERIC_GRADE 
        FROM GRADE g
        JOIN STUDENT s ON s.STUDENT_ID = g.STUDENT_ID
        WHERE g.SECTION_ID = 90 AND g.GRADE_TYPE_CODE = 'FI'
        GROUP BY s.LAST_NAME
      )
   )
ORDER BY s.LAST_NAME;