多表JOIN与GROUP BY统计异常:用户月度折扣金额求和结果不符
问题排查与SQL修正
首先看你的表结构和关联逻辑,问题出在auth_user和staffuser的关联条件错误上:
你的staffuser表有user_id字段,这个字段应该是关联auth_user表的id(也就是用户的主ID),但你当前SQL里写的是d.id = b.id——这相当于把staffuser的ID直接和auth_user的ID绑定,而不是通过staffuser的user_id关联,这就导致你拿到的first_name根本不是对应service_provider(也就是staffuser)的用户名称,自然匹配错误。
另外,建议你使用显式JOIN语法代替老式的隐式逗号连接,这样关联逻辑更清晰,不容易出错。
修正后的SQL语句
SELECT a.service_provider_id, d.first_name, SUM(a.discounted_price) AS total FROM billing_customerservicebill a JOIN users_staffuser b ON a.service_provider_id = b.id JOIN auth_user d ON d.id = b.user_id -- 这里修正了关联条件,用staffuser的user_id关联auth_user的id JOIN billing_billmanagement c ON a.bill_id = c.id WHERE c.creation_date BETWEEN '2017-12-01' AND '2017-12-31' GROUP BY a.service_provider_id, d.first_name ORDER BY a.service_provider_id;
关键修正点
- 把
d.id = b.id改成d.id = b.user_id,这才是符合你表结构的正确关联逻辑,确保first_name对应到该staffuser所属的auth_user。 - 改用显式JOIN,让表之间的关联关系一目了然,减少后续维护出错的概率。
- GROUP BY和ORDER BY里尽量使用完整的字段引用(比如
a.service_provider_id而不是1),提升SQL的可读性。
这样执行后,就能得到你期望的结果:每个service_provider_id对应正确的first_name,同时discounted_price的总和也准确。
内容的提问来源于stack exchange,提问作者user8932251
相关产品推荐
相关产品推荐

