Sql 以下平均子查询未显示正确结果

Sql 以下平均子查询未显示正确结果,sql,oracle,Sql,Oracle,我试图列出在第三次测验中成绩低于平均水平的学生 首先我选择 SELECT s.STUDENT_ID, s.LAST_NAME,g.GRADE_TYPE_CODE,AVG (g.NUMERIC_GRADE) AS GRADE FROM STUDENT s, GRADE g WHERE s.STUDENT_ID = g.STUDENT_ID AND g.SECTION_ID = 135 AND g.GRADE_TYPE_CODE= 'QZ' AND g.GRADE_CODE_OCCURRENCE =

我试图列出在第三次测验中成绩低于平均水平的学生

首先我选择

SELECT s.STUDENT_ID, s.LAST_NAME,g.GRADE_TYPE_CODE,AVG (g.NUMERIC_GRADE) AS GRADE
FROM STUDENT s, GRADE g
WHERE s.STUDENT_ID = g.STUDENT_ID
AND g.SECTION_ID = 135 AND g.GRADE_TYPE_CODE= 'QZ' AND g.GRADE_CODE_OCCURRENCE = 3 
GROUP BY s.STUDENT_ID, s.LAST_NAME,g.GRADE_TYPE_CODE
我得到了四个平均的结果

STUDENT_ID LAST_NAME                      GRADE
---------- ------------------------- ----------
   178      Kurtz                             98 
   215      Chatman                           90 
   259      Merriman                          81 
   214      Williams                          99 
但当我想选择那些接收到低于平均水平的人时,我选择了165行

  SELECT z.STUDENT_ID, z.LAST_NAME
  FROM STUDENT z, GRADE w
  WHERE z.STUDENT_ID = w.STUDENT_ID
  GROUP BY z.STUDENT_ID, z.LAST_NAME
  HAVING COUNT(*) < 
  (SELECT AVG(GRADE) 
  FROM
  (SELECT s.STUDENT_ID, s.LAST_NAME,g.GRADE_TYPE_CODE,AVG (g.NUMERIC_GRADE) AS GRADE
  FROM STUDENT s, GRADE g
  WHERE s.STUDENT_ID = g.STUDENT_ID
  AND g.SECTION_ID = 135 AND g.GRADE_TYPE_CODE= 'QZ' AND g.GRADE_CODE_OCCURRENCE = 3 
  GROUP BY s.STUDENT_ID, s.LAST_NAME,g.GRADE_TYPE_CODE ))

 ORDER BY z.LAST_NAME;

我做错了什么?我如何列出成绩低于平均分的学生?

如果我正确理解了你的问题,下面是一个简化版本,使用了avg over的常用表格表达式:


如果我正确理解了您的问题,下面是一个简化版本,它使用了一个使用avg over的通用表表达式:


如果我正确理解了您的问题,下面是一个简化版本,它使用了一个使用avg over的通用表表达式:


如果我正确理解了您的问题,下面是一个简化版本,它使用了一个使用avg over的通用表表达式:

with cte as (
  select s.student_id, s.last_name, g.numeric_grade,
    avg(g.numeric_grade) over () average
  from student s
    join grade g on s.student_id = g.student_id
  where g.section_id = 135 
    and g.grade_type_code = 'QZ' 
    and g.grade_code_occurence = 3
  )
select student_id, last_name
from cte
group by student_id, last_name
having avg(numeric_grade) < avg(average)