Getting the above average student from database

泪湿孤枕 提交于 2019-12-01 14:03:27

This should do the job. First inner query will give you the result of average of all students. While second will give the avg for the table.

    SELECT student_full_name 
    FROM (SELECT student_full_name,
                 AVG(results) AS average_Sresult
          FROM viewEnrol
          GROUP BY student_full_name) sre, 
         (SELECT (AVG(results)) tavg
          FROM viewEnrol) ta
     WHERE sre.average_Sresult > ta.tavg

PS: Should not you take the avg of avg rather than taking the avg of all results.

If you want to filter your results after aggregation (like avg), you need to use having rather than where.

General rule is:

  • where filters what raw (non-aggregated) rows you get from the actual database before the aggregation takes place; and
  • having filters what (possibly aggregated) rows are finally delivered to you.

Something like (though untested):

SELECT   student_full_name,
         AVG (results) AS average_result
FROM     viewEnrol
GROUP BY student_full_name
HAVING   AVG (results) > ( SELECT AVG (results) FROM viewEnrol )

Getting the average result should just be a matter of filtering, so you shouldn't need to reference the outer query when calculating the global average. Your pseudo code is very close to what you need. You probably want to convert the where clause to a having clause. You also seem to be after comparing students that are above average students - not students who are performing above the net average. Make sure you're perfectly clear on what the definition of average is.

Something on this form:

select student_full_name, avg(results) as avg_result
from viewEnrol
group by student_full_name
having avg(results) > (
    select avg(avg_results)
    from (
        select name, avg(results) as avg_results
        group by student_full_name
        )
    )
SAMPATH

Every problem as a solution, I created a table

CREATE TABLE STUD
(SNAME varchar(20),
 SCODE NUMBER    PRIMARY KEY,
 MARKS NUMBER(4,2))

Inserted values

SNAME   SCODE   MARKS
--------------------
SAM     1001    90
VAS     1001    80
SAM     1002    60
ANAND   1001    80
VAS     1002    70
ANAND   1002    50

Query is

SELECT SNAME,AVG(MARKS) FROM STUD GROUP BY SNAME HAVING AVG(MARKS)>=
(SELECT MAX(MARKS ) FROM STUD WHERE SNAME='VAS')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!