如何使用单条MySQL语句从单成绩表中计算学生最终成绩(基于各类型成绩最大值的平均值)
单条MySQL语句实现学生最终成绩计算
当然可以用单条MySQL语句完成这个需求!我们可以借助条件聚合的思路来实现,既简洁又高效。
实现思路
核心逻辑是按学生分组后,分别提取每个学生grade1和grade2的最高分,再对这两个分数求平均值。这里用到MAX()函数结合CASE WHEN的条件判断,来精准筛选对应成绩类型的最高分。
具体查询语句
假设你的成绩表名为student_scores,对应的SQL语句如下:
SELECT 学生, ROUND((MAX(CASE WHEN 成绩类型 = 'grade1' THEN 分数 END) + MAX(CASE WHEN 成绩类型 = 'grade2' THEN 分数 END)) / 2, 0) AS final_score FROM student_scores GROUP BY 学生;
语句细节解释
GROUP BY 学生:按学生姓名分组,保证每个学生只生成一行结果,避免重复数据。MAX(CASE WHEN 成绩类型 = 'grade1' THEN 分数 END):针对当前学生的所有记录,筛选出grade1类型的分数并取最大值;同理第二个MAX()函数负责获取grade2的最高分。ROUND(..., 0):将计算出的平均值四舍五入为整数(和你提供的示例结果格式一致),如果需要保留小数位数,调整第二个参数即可(比如保留1位小数写1)。
示例数据验证
用你给出的测试数据运行这条语句,会得到完全符合期望的结果:
| 学生 | final_score |
|---|---|
| Alex | 80 |
| Joe | 75 |
特殊情况处理(可选)
如果存在学生缺少grade1或grade2记录的情况,上面的语句会返回NULL作为最终成绩。如果需要给缺失的成绩类型设置默认值(比如0),可以用COALESCE()函数处理:
SELECT 学生, ROUND((COALESCE(MAX(CASE WHEN 成绩类型 = 'grade1' THEN 分数 END), 0) + COALESCE(MAX(CASE WHEN 成绩类型 = 'grade2' THEN 分数 END), 0)) / 2, 0) AS final_score FROM student_scores GROUP BY 学生;
内容的提问来源于stack exchange,提问作者Anwar Saiah
相关产品推荐
相关产品推荐

