统计成绩高于平均分的人数SQL执行结果异常问题排查
问题原因分析
- 核心错误出在子查询的
GROUP BY grade逻辑上:子查询按成绩分组后,AVG(grade)计算的是每个分组内的成绩平均值,而非全表的整体平均成绩。 - 由于你是按
grade字段分组,同一个分组内所有学生的成绩完全一致,因此每个分组的AVG(grade)结果就等于该分组的grade值本身:- 使用
grade >= AVG(grade)作为条件时,所有分组都满足要求,子查询返回全部存在的成绩值,外层查询匹配到所有学生,最终返回全体学生总数。 - 改成
grade > AVG(grade)后,没有任何分组能满足“成绩大于自身平均值”的条件,子查询返回空,外层查询匹配不到任何学生,因此结果为0。
- 使用
- 你用固定整数代替
AVG(grade)时,避开了分组后的平均值计算逻辑错误,因此结果符合预期。
正确实现代码
要统计成绩高于全表平均分的学生人数,直接用标量子查询计算全表平均分即可,不需要分组:
SELECT count(*) FROM data.students WHERE grade > (SELECT AVG(grade) FROM data.students);
内容的提问来源于stack exchange,提问作者VIP1337
相关产品推荐
相关产品推荐

