1

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

 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. 然后查询将列出所有得分高于平均分的学生。

我知道我必须在这里使用子查询才能获得所有结果的 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

//编辑

输出应该看起来像。Kal Penn 和 Han Solo 没有被列出,因为他们没有达到平均水平。所有科目的平均分是 69.33。Han Solo 得到 57.5,Kal Penn 得到 65。

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          85.5

有什么帮助吗?

4

5 回答 5

4

如果要在聚合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 )
于 2012-05-31T05:29:23.823 回答
4

这应该可以完成这项工作。第一个内部查询将为您提供所有学生的平均结果。而第二个将给出表格的平均值。

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

于 2012-05-31T05:34:21.023 回答
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
        )
    )
于 2012-05-31T05:34:39.997 回答
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')
于 2012-05-31T05:58:31.217 回答
0
select * from viewEnrol group by student_full_name having result>( select avg(result) from Student);
于 2020-09-05T12:17:05.207 回答