You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SUM()函数在该SQL成绩查询中无法返回精确值?

问题分析与解决方案

咱们先拆解一下你的问题,核心是SUM()函数误用加上计算逻辑与SQL代码不匹配,还有分组逻辑的问题,最终导致结果出现偏差:

1. SUM()函数用错了场景

从你的表结构来看,每个学生应该对应一条独立记录(s_id应该是学生唯一标识吧?)。SUM()的作用是对多行数据的字段值求和,而你现在是在单个记录里对两个字段做加法,再套上SUM()完全没必要——如果表中没有重复的学生记录,SUM()其实不会改变结果,但一旦存在重复行,就会把所有重复行的计算值累加,直接导致结果偏大。

2. 计算逻辑与SQL代码完全不符

你预期的计算规则是:

  • mid_english = mid_1_english + mid_2_english
  • mid_mathematics = mid_1_mathematics + mid_2_mathematics
  • total_english = mid_english + semester_final_english
  • total_mathematics = mid_mathematics + semester_final_mathematics
  • total = total_english + total_mathematics

但你的原SQL里:

  • 给mid_english和mid_mathematics加了/2,变成了求平均值,和预期的“求和”要求完全相反;
  • 计算total的时候,错误重复加了两次semester_final_mathematics,还漏掉了semester_final_english,同时保留了错误的除以2的逻辑,双重偏离预期。

3. GROUP BY的逻辑错误

你用s_f_name, s_l_name作为分组依据,但SELECT里包含了s_id, s_roll_no, s_class这些非分组字段。如果存在重名的学生,这会把多个学生的记录合并到同一组,SUM()就会把他们的成绩全部累加,结果彻底偏离预期。正确的分组应该用唯一标识学生的字段,比如s_id或者s_roll_no;如果每个学生只有一行记录,甚至完全不需要GROUP BY。


修正后的SQL

根据你的预期逻辑,正确的SQL应该是这样的:

SELECT 
    s_id, 
    s_f_name, 
    s_l_name, 
    s_roll_no, 
    s_class, 
    mid_1_english + mid_2_english AS mid_english,
    mid_1_mathematics + mid_2_mathematics AS mid_mathematics,
    semester_final_english,
    semester_final_mathematics,
    (mid_1_english + mid_2_english) + semester_final_english AS total_english,
    (mid_1_mathematics + mid_2_mathematics) + semester_final_mathematics AS total_mathematics,
    (mid_1_english + mid_2_english + semester_final_english) + 
    (mid_1_mathematics + mid_2_mathematics + semester_final_mathematics) AS total
FROM elaborate_term_result_sheet
ORDER BY s_roll_no;

如果你的表中确实存在同一个学生的多行记录(比如多次录入),需要按学生分组求和,那才需要用到SUM(),这时候的SQL应该是:

SELECT 
    s_id, 
    s_f_name, 
    s_l_name, 
    s_roll_no, 
    s_class, 
    SUM(mid_1_english) + SUM(mid_2_english) AS mid_english,
    SUM(mid_1_mathematics) + SUM(mid_2_mathematics) AS mid_mathematics,
    SUM(semester_final_english) AS semester_final_english,
    SUM(semester_final_mathematics) AS semester_final_mathematics,
    SUM(mid_1_english + mid_2_english + semester_final_english) AS total_english,
    SUM(mid_1_mathematics + mid_2_mathematics + semester_final_mathematics) AS total_mathematics,
    SUM(mid_1_english + mid_2_english + semester_final_english + mid_1_mathematics + mid_2_mathematics + semester_final_mathematics) AS total
FROM elaborate_term_result_sheet
GROUP BY s_id, s_f_name, s_l_name, s_roll_no, s_class
ORDER BY s_roll_no;

(注意这里GROUP BY包含了所有SELECT里的非聚合字段,避免分组逻辑错误)


总结一下,你之前的SUM()返回不精确值,主要是三个原因:SUM()误用在单记录字段计算、计算逻辑与代码严重不符(除以2、重复加字段)、分组字段选择错误导致合并了多个学生的数据。

内容的提问来源于stack exchange,提问作者Bappi_SB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:52:06