首页 > 解决方案 > 计算平均人数

问题描述

我试图计算有多少人的成绩高于平均水平。
我目前所拥有的会返回学生人数,当我从 ">=" 中删除“=”时,它会返回 0。

SELECT count(*) 
FROM data.students
WHERE grade IN (SELECT grade 
               FROM data.students
               GROUP BY grade HAVING grade >= AVG(grade));

如果我放一个整数而不是avg()函数,我会得到很好的结果。我究竟做错了什么?

标签: sqlpostgresqlaggregation

解决方案


在子查询中计算 avg 可能是最快的:

SELECT count(*)
FROM   data.students
WHERE  grade > (SELECT avg(grade) FROM data.students);

>而不是>=,因为你说“比平均成绩高”

我究竟做错了什么?

在您的子查询中,GROUP BY grade每个不同的值聚合到一行gradeavg(grade)必然与每一行完全相同grade(除了grade IS NULL)。解释你所看到的。
您的查询一开始就不必要地复杂。


推荐阅读