关联brg_laku与stok_brg表时SUM计算结果异常,如何修正?
解决SQL关联后SUM计算错误的问题
你遇到的核心问题是直接关联两张表后再聚合会产生笛卡尔积,导致数据被重复计算。举个例子:如果某个商品在销售表有2条记录,在库存表有2条记录,关联后会生成4条记录——这时候SUM(dibeli)会把销售数量重复加2次,SUM(stok)也会把库存数量重复加2次,结果自然就错了。
正确的思路是先分别对两张表做聚合统计,再关联结果,这样就能避免重复计算的问题。下面是修正后的SQL:
SELECT COALESCE(s.id_brg, k.id_brg) AS id_brg, COALESCE(s.sold, 0) AS sold, COALESCE(k.stock, 0) AS stock FROM ( -- 先统计每个商品的销售总量 SELECT id_brg, SUM(dibeli) AS sold FROM brg_laku GROUP BY id_brg ) s -- 用全外关联确保所有商品都能被统计(无论有没有销售/库存) FULL OUTER JOIN ( -- 再统计每个商品的库存总量 SELECT id_brg, SUM(stok) AS stock FROM stok_brg GROUP BY id_brg ) k ON s.id_brg = k.id_brg
补充说明:
- 如果只需要统计同时有销售记录和库存记录的商品,可以把
FULL OUTER JOIN改成INNER JOIN。 COALESCE函数用来处理NULL值:比如某个商品只有库存没有销售,sold会显示0;反之stock显示0,避免结果出现NULL。
用你提供的销售表数据测试,这个SQL会正确计算出:
- BRG-000001的
sold为3(2+1) - BRG-000003的
sold为9(5+4)
库存总量则会根据stok_brg表的实际数据准确求和,不会被重复计算。
内容的提问来源于stack exchange,提问作者Vivi Novita Sari
相关产品推荐
相关产品推荐

