简体   繁体   English

在AVG子查询上方,没有返回结果

[英]Above AVG sub-query returning no results

I am trying to get a list of students who have above average on the final exam 我正在尝试列出期末考试成绩高于平均水平的学生

I first select to get 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

and I get these four results 我得到这四个结果

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

But when I try to get the above average from these four I get no rows, and it looks like sub-query and main-query have the same conditions. 但是,当我尝试从这四个中获得上述平均值时,我没有任何行,并且看起来子查询和主查询具有相同的条件。 I am not sure how to do above after 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;

I want to get numberic_grade 91 and 92 because it is above average. 我想获得numberic_grade 91和92,因为它高于平均值。 Why is it giving me no rows when I am trying to select those who have above average on the final exam ? 为什么当我试图选择那些期末考试中的成绩高于平均水平的人时,为什么没有任何行?

There are several problems with your query: 您的查询存在几个问题:

  • You need to use AVG in the first GROUP BY query as well 您还需要在第一个GROUP BY查询中使用AVG
  • You need to restrict the top query by the same condition as the inner query (ie grade type code and section id) 您需要通过与内部查询相同的条件来限制排名靠前的查询(即成绩类型代码和栏目ID)
  • You do not need to join section, because you are restricting on its ID, which is available from the GRADE table 您不需要加入部分,因为您对其ID有所限制,可以从GRADE表中获得该ID。
  • You should use aliases that at least slightly resemble the table name: it goes long way to helping readability 应该使用至少与表名稍有相似的别名:它有助于提高可读性
  • You should use ANSI joins for better readability 应该使用ANSI连接以提高可读性

Try a query with these corrections: 尝试查询以下更正:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM