为何SUM()函数在该SQL成绩查询中无法返回精确值?
问题分析与解决方案
咱们先拆解一下你的问题,核心是SUM()函数误用加上计算逻辑与SQL代码不匹配,还有分组逻辑的问题,最终导致结果出现偏差:
1. SUM()函数用错了场景
从你的表结构来看,每个学生应该对应一条独立记录(s_id应该是学生唯一标识吧?)。SUM()的作用是对多行数据的字段值求和,而你现在是在单个记录里对两个字段做加法,再套上SUM()完全没必要——如果表中没有重复的学生记录,SUM()其实不会改变结果,但一旦存在重复行,就会把所有重复行的计算值累加,直接导致结果偏大。
2. 计算逻辑与SQL代码完全不符
你预期的计算规则是:
mid_english = mid_1_english + mid_2_englishmid_mathematics = mid_1_mathematics + mid_2_mathematicstotal_english = mid_english + semester_final_englishtotal_mathematics = mid_mathematics + semester_final_mathematicstotal = 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
相关产品推荐
相关产品推荐

