Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 上述平均子查询未返回任何结果_Sql_Oracle_Subquery_Average - Fatal编程技术网

Sql 上述平均子查询未返回任何结果

Sql 上述平均子查询未返回任何结果,sql,oracle,subquery,average,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 B

我正试图得到一份期末考试成绩高于平均水平的学生名单

我首先选择平均值

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;

我想考91级和92级,因为它高于平均水平。当我试图选择期末考试成绩高于平均水平的学生时,为什么没有给我行?

您的查询有几个问题:

  • 您还需要在第一个
    groupby
    查询中使用
    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;