【问题标题】:Above AVG sub-query returning no results上面的 AVG 子查询没有返回结果
【发布时间】:2013-10-18 09:01:31
【问题描述】:

我正在尝试获取期末考试成绩高于平均水平的学生名单

我先选择取平均值

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 

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

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,因为它高于平均水平。为什么当我试图选择那些在期末考试中高于平均水平的人时,它没有给我任何行?

【问题讨论】:

    标签: sql oracle subquery average


    【解决方案1】:

    您的查询有几个问题:

    • 您还需要在第一个 GROUP BY 查询中使用 AVG
    • 您需要通过与内部查询相同的条件(即等级类型代码和部分 id)来限制顶部查询
    • 您不需要加入部分,因为您限制了其 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;
    

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 2016-08-22
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2014-11-08
      • 1970-01-01
      相关资源
      最近更新 更多