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

SQL关联三张表 分别统计PlanA/PlanB收入及总收入

问题根因

直接JOIN三张表拿不到正确结果,核心原因是PlanA_income和PlanB_income中同一个ID对应多条收入明细,三表直接关联会产生笛卡尔积,把记录行数成倍放大,后续求和自然会出现数值翻倍的错误。

正确写法

不要先关联再聚合,先分别把两个收入表按ID分组算出单表的收入总和,再和主表关联计算总金额,就能完全避免重复计算的问题,参考SQL如下:

SELECT
  t1.ID,
  t1.Name,
  COALESCE(a.planA_sum, 0) AS `sum of planA income`,
  COALESCE(b.planB_sum, 0) AS `sum of planB income`,
  COALESCE(a.planA_sum, 0) + COALESCE(b.planB_sum, 0) AS `Total Income`
FROM Table1 t1
LEFT JOIN (
  SELECT ID, SUM(Income) planA_sum
  FROM PlanA_income
  GROUP BY ID
) a ON t1.ID = a.ID
LEFT JOIN (
  SELECT ID, SUM(Income) planB_sum
  FROM PlanB_income
  GROUP BY ID
) b ON t1.ID = b.ID
执行结果

运行上述语句会完全返回预期结果:

IDNamesum of planA incomesum of planB incomeTotal Income
1Sam450300750
2Anderson25175200
补充说明
  • 用LEFT JOIN是为了覆盖用户在某类收入计划下无任何记录的场景,不会漏掉主表的用户数据
  • COALESCE函数用于把无记录时返回的NULL值转为0,避免总金额计算返回NULL
  • 多表关联做分类求和时,先聚合再关联是通用的避坑原则,只要涉及一对多、多对多的表关联求和都可以按这个思路写

内容的提问来源于stack exchange,提问作者A. Chithrai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:06:21