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

SQL查询:获取单表所有行及关联表同ID的求和结果(含空分组)

解决分组全量展示及关联求和为0的问题

嘿,我明白你的困扰了——想要展示所有分组,哪怕这个分组里没有学生或者学生没提交作业,求和结果也要显示0对吧?咱们一步步来修正你的查询:

问题根源

你最开始用的隐式内连接(逗号分隔表)会自动过滤掉没有匹配学生/作业的分组,后来的LEFT JOIN思路是对的,但有两个小问题:

  1. 当没有关联的作业行时,SUM(w.points)会返回NULL而不是0
  2. 分组逻辑在严格SQL模式下可能有问题,而且如果不需要学生信息的话,没必要把s.name加入查询

修正后的查询语句

SELECT 
    g.group_id,
    g.name,
    COALESCE(SUM(w.points), 0) AS total_points,
    COALESCE(SUM(w.points2), 0) AS total_points2
FROM groups g
LEFT JOIN students s ON g.group_id = s.group_id
LEFT JOIN works w ON s.student_id = w.student_id
GROUP BY g.group_id, g.name;

关键细节解释

  • LEFT JOIN的正确使用:从groups表出发,先左连接students再左连接works,这样不管分组有没有学生、学生有没有作业,groups的所有行都会被保留在结果里。
  • COALESCE处理NULL:SUM()函数在没有匹配行时会返回NULL,COALESCE函数可以把这个NULL替换成你想要的0,完美符合你“无数据时显示0”的需求。
  • GROUP BY的兼容性:我把g.group_id和g.name都放在分组里了——如果group_id是groups表的主键,其实只按group_id分组也可以,但加上g.name能兼容开启了ONLY_FULL_GROUP_BY模式的数据库(比如MySQL),避免语法错误。

如果你的业务需要展示学生信息,也可以调整查询,但要注意用COALESCE(s.name, '无学生')这类处理来显示友好的空值提示。

内容的提问来源于stack exchange,提问作者Michał B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:28:19