I\'ve created a view that contains:
student_full_name subject_code result
Jennifer Higgins CS1234 81
Jennifer Higgins CS1235
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; andhaving
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 )
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')
select * from viewEnrol group by student_full_name having result>( select avg(result) from Student);
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
)
)
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.