Getting the above average student from database

后端 未结 5 1318
别跟我提以往
别跟我提以往 2021-01-15 18:40

I\'ve created a view that contains:

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          81
 Jennifer Higgins     CS1235                


        
相关标签:
5条回答
  • 2021-01-15 19:15

    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 )
    
    0 讨论(0)
  • 2021-01-15 19:16

    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')
    
    0 讨论(0)
  • 2021-01-15 19:28
    select * from viewEnrol group by student_full_name having result>( select avg(result) from Student);
    
    0 讨论(0)
  • 2021-01-15 19:33

    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
            )
        )
    
    0 讨论(0)
  • 2021-01-15 19:35

    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.

    0 讨论(0)
提交回复
热议问题