从数据库中获得上述普通学生

时间:2012-05-31 05:22:47

标签: sql-server tsql average

我创建了一个包含以下内容的视图:

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          81
 Jennifer Higgins     CS1235          90
 Kal Penn             CS1234          70
 Kal Penn             CS1235          60
 Han Solo             CS1234          45
 Han Solo             CS1235          70

我想得到:

  1. 每个学生的平均成绩就像Jennifer Higgins参加CS1234和CS1235一样。 她的平均分数是85.50。

  2. 然后将Jennifer Higgins的分数与所有报名的平均分数进行比较 所以总计所有科目的AVG(结果)。

  3. 然后,查询将列出所有获得高于平均分数的学生。

  4. 我知道我必须在这里使用子查询才能获得所有结果的AVG。 嗯,这是一种伪代码。我很困惑,因为我不确定如何使子查询与查询的结果进行比较。 我很确定我需要两个group by语句,一个用于student_full_name分组,另一个用于获得所有平均结果。

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

    // EDIT

    OUTPUT应该是这样的。 Kal Penn和Han Solo没有被列入,因为他们没有达到高于平均水平。 所有科目的平均分为69.33。 Han Solo得到57.5,Kal Penn得到65。

     student_full_name    subject_code    result
     Jennifer Higgins     CS1234          85.5
    

    任何帮助?

5 个答案:

答案 0 :(得分:3)

这应该可以胜任。第一个内部查询将为您提供所有学生的平均结果。 虽然第二个会为表格提供平均值。

    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:你不应该采取avg avg而不是平均所有结果。

答案 1 :(得分:2)

如果您希望在聚合后过滤结果(例如avg),则需要使用having而不是where

一般规则是:

  • where过滤在聚合发生之前从实际数据库获得的原始(非聚合)行;和
  • having过滤最终传递给您的行(可能是聚合的)。

类似(虽然未经测试):

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

答案 2 :(得分:0)

获得平均结果应该只是过滤问题,因此在计算全局平均值时不需要引用外部查询。您的伪代码非常接近您的需要。您可能希望将where子句转换为having子句。您似乎也在比较高于普通学生的学生 - 而不是高于平均成绩的学生。确保你完全清楚平均值的定义是什么。

此表格上的内容:

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
        )
    )

答案 3 :(得分:0)

作为解决方案的每个问题,我创建了一个表

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

插入值

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

查询

SELECT SNAME,AVG(MARKS) FROM STUD GROUP BY SNAME HAVING AVG(MARKS)>=
(SELECT MAX(MARKS ) FROM STUD WHERE SNAME='VAS')

答案 4 :(得分:0)

select * from viewEnrol group by student_full_name having result>( select avg(result) from Student);