充分利用数据库中的高于平均水平的学生(Getting the above average stude

2019-06-25 00:31发布

我创建了一个包含一个观点:

 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. 每个学生的平均成绩这么喜欢说詹妮弗·希金斯参加CS1234和CS1235。 她的平均成绩是85.50。

  2. 然后詹妮弗希金斯标记将与所有的入学率因此,对于所有科目合计了AVG(结果)的平均成绩。

  3. 然后,查询将列出所有谁也越来越高于平均分数的学生。

我知道我必须为了得到所有结果的AVG这里使用子查询。 嗯,这是排序的伪代码。 我是因为我不知道如何使自己比较查询结果子查询相当卡住。 我敢肯定,我需要两个组通过声明一个由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

//编辑

输出应该的样子。 卡尔佩恩和韩索罗未被列为他们没有获得高于平均水平的标志。 所有科目的平均成绩是69.33。 韩独奏了57.5和卡尔佩恩得了65。

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          85.5

任何帮助吗?

Answer 1:

这应该做的工作。 首先内部查询会给你平均所有学生的结果。 虽然第二将给表的魅力。

    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:如果你不采取平均的平均,而不是把所有结果的平均。



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


Answer 3:

获得的平均结果应该只是过滤的问题,所以你不应该需要计算的全球平均水平时,引用外部查询。 你的伪代码是非常接近你所需要的。 你可能想在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
        )
    )


Answer 4:

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

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


文章来源: Getting the above average student from database