SQL Join查询SUM()结果异常求助:关联后求和值被放大6倍
问题原因
你在Query 2中使用隐式连接时,没有指定payments_cable与areas表的关联条件,仅过滤了areas.user = "faruk",这会导致两张表产生笛卡尔积:payments_cable的每条记录都会和areas中符合user="faruk"的所有记录匹配,最终SUM(amount)会把每条金额重复计算多次(你这里是6次),所以结果被放大。
解决方案
需要通过显式JOIN语句指定两张表的关联条件(假设关联字段为area,如果实际关联字段不同,替换成对应字段即可),确保只统计faruk对应的区域的支付记录,同时保持正确的分组逻辑:
SELECT areas.user, payments_cable.area, payments_cable.r_month, payments_cable.year, SUM(payments_cable.amount) AS total, payments_cable.paid FROM payments_cable INNER JOIN areas ON payments_cable.area = areas.area -- 关键关联条件,需与实际业务字段匹配 WHERE areas.user = "faruk" GROUP BY payments_cable.r_month, payments_cable.year, payments_cable.paid, areas.user, payments_cable.area -- 分组需包含所有非聚合字段(符合SQL标准模式要求) ORDER BY STR_TO_DATE(CONCAT(payments_cable.year, payments_cable.r_month), '%Y %M') DESC;
如果不需要返回areas.user字段,也可以先从areas中获取faruk对应的area列表,再用这个列表过滤payments_cable表,写法更简洁:
SELECT area, r_month, year, SUM(amount) AS total, paid FROM payments_cable WHERE area IN (SELECT area FROM areas WHERE user = "faruk") GROUP BY r_month, year, paid, area ORDER BY STR_TO_DATE(CONCAT(year, r_month), '%Y %M') DESC;
这两种写法都能避免笛卡尔积,得到正确的金额合计结果。
内容的提问来源于stack exchange,提问作者Mizan Hosen
相关产品推荐
相关产品推荐

