SQL查询报错求助:计算学生平均分返回结果行数不符
排查SQL语句的潜在问题
以下是可能导致结果行数不符合预期的几个关键点:
分组前的分数过滤逻辑错误
当前WHERE score >= 0.9会在分组前直接剔除单场考试分数低于0.9的记录。如果你的预期是统计参加了两场考试且平均分达标的学生,而非单场分数都达标,这个条件应该放到HAVING子句中,改为HAVING ROUND(AVG(score), 2) >= 0.9——这样会先计算两场考试的平均分,再过滤出平均分达标的学生,避免提前剔除部分有效记录。未限制学生必须参加两场指定考试
现有查询会包含只参加了English Test或History Test其中一场且分数>=0.9的学生。如果预期的11行是同时参加了两场考试的学生,需要在分组后添加HAVING COUNT(DISTINCT test_name) = 2,确保每个分组的学生都有两场考试的记录。GROUP BY子句冗余(非核心问题,但可优化)
如果id是students表的主键,GROUP BY id就足够唯一标识每个学生,first_name和last_name不需要加入GROUP BY(多数现代SQL引擎支持非聚合列在SELECT中只要被主键唯一确定),不过这个不会直接影响结果行数。
修正后的示例SQL(假设需要同时满足参加两场考试且平均分>=0.9):
SELECT first_name, last_name, ROUND(AVG(score), 2) AS avg_score FROM students WHERE test_name IN ('English Test', 'History Test') GROUP BY id, first_name, last_name HAVING COUNT(DISTINCT test_name) = 2 AND ROUND(AVG(score), 2) >= 0.9 ORDER BY avg_score DESC;
内容的提问来源于stack exchange,提问作者Mariz Papas
相关产品推荐
相关产品推荐

