我创建了一个视图,其中包含:
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。
然后将詹妮弗·希金斯的分数与所有入学的平均分进行比较
因此,将所有科目的 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
输出应该看起来像。卡尔·潘和汉·索罗没有被列入名单,因为他们没有获得高于平均分的分数。
所有科目的平均分是69.33。汉·索罗 (Han Solo) 得到 57.5 分,卡尔·潘 (Kal Penn) 得到 65 分。
student_full_name subject_code result
Jennifer Higgins CS1234 85.5
有什么帮助吗?
如果您想过滤结果after聚合(如avg
),你需要使用having
而不是where
.
一般规则是:
-
where
过滤从实际数据库中获取的原始(非聚合)行before发生聚合;和
-
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 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)