我创建了一个包含一个观点:
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
我想获得:
每个学生的平均成绩这么喜欢说詹妮弗·希金斯参加CS1234和CS1235。 她的平均成绩是85.50。
然后詹妮弗希金斯标记将与所有的入学率因此,对于所有科目合计了AVG(结果)的平均成绩。
然后,查询将列出所有谁也越来越高于平均分数的学生。
我知道我必须为了得到所有结果的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
任何帮助吗?
这应该做的工作。 首先内部查询会给你平均所有学生的结果。 虽然第二将给表的魅力。
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
),你需要使用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 )
获得的平均结果应该只是过滤的问题,所以你不应该需要计算的全球平均水平时,引用外部查询。 你的伪代码是非常接近你所需要的。 你可能想在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
)
)
每个问题的解决方案,我创建了一个表
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')