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
执行结果
运行上述语句会完全返回预期结果:
| ID | Name | sum of planA income | sum of planB income | Total Income |
|---|---|---|---|---|
| 1 | Sam | 450 | 300 | 750 |
| 2 | Anderson | 25 | 175 | 200 |
补充说明
- 用
LEFT JOIN是为了覆盖用户在某类收入计划下无任何记录的场景,不会漏掉主表的用户数据 COALESCE函数用于把无记录时返回的NULL值转为0,避免总金额计算返回NULL- 多表关联做分类求和时,先聚合再关联是通用的避坑原则,只要涉及一对多、多对多的表关联求和都可以按这个思路写
内容的提问来源于stack exchange,提问作者A. Chithrai
相关产品推荐
相关产品推荐

