我创建了一个包含以下内容的视图:
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
我想得到:
每个学生的平均成绩就像Jennifer Higgins参加CS1234和CS1235一样。 她的平均分数是85.50。
然后将Jennifer Higgins的分数与所有报名的平均分数进行比较 所以总计所有科目的AVG(结果)。
然后,查询将列出所有获得高于平均分数的学生。
我知道我必须在这里使用子查询才能获得所有结果的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
任何帮助?
答案 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);