MySQL单表求和问题:库存管控系统出入库计算结果异常
库存管控系统:入库减出库计算错误的解决方案
嘿,我来帮你搞定这个库存计算的问题!从你描述的结果来看,你得到的80刚好是所有异动数量的总和(40+20+10+10),这说明你的查询逻辑大概率是没有把出库数量当成负值来计算,反而把入库和出库的数量全加在了一起,自然就和正确结果40差了一倍。
常见错误原因
你可能写了类似这样的错误查询:
-- 错误示例:把出库数量也做了累加,而不是减去 SELECT product_code, SUM(quantity) AS total FROM product_movements WHERE type IN ('in', 'out') GROUP BY product_code;
或者虽然分了type,但计算时逻辑搞反了,比如把出库的数量也加到了入库总和里。
正确的两种查询写法
写法1:分别计算入库/出库总和再相减
这种写法逻辑清晰,容易理解,还能单独看到入库和出库的总量:
SELECT pm.product_code, -- 入库总和(没有入库则取0) COALESCE(SUM(CASE WHEN pm.type = 'in' THEN pm.quantity END), 0) AS total_in, -- 出库总和(没有出库则取0) COALESCE(SUM(CASE WHEN pm.type = 'out' THEN pm.quantity END), 0) AS total_out, -- 计算库存净额 (COALESCE(SUM(CASE WHEN pm.type = 'in' THEN pm.quantity END), 0) - COALESCE(SUM(CASE WHEN pm.type = 'out' THEN pm.quantity END), 0)) AS net_stock FROM product_movements pm GROUP BY pm.product_code;
这里用COALESCE是为了避免某个商品只有入库/只有出库时,SUM返回NULL导致最终结果异常,用它把NULL转成0就稳妥了。
写法2:用CASE WHEN直接处理数量符号
这种写法更简洁,直接给出库数量赋值为负,然后统一求和:
SELECT pm.product_code, SUM(CASE WHEN pm.type = 'in' THEN pm.quantity WHEN pm.type = 'out' THEN -pm.quantity ELSE 0 END) AS net_stock FROM product_movements pm GROUP BY pm.product_code;
关联商品表显示完整信息
如果需要同时展示商品的描述,可以用LEFT JOIN关联商品表(确保没有异动记录的商品也能被查询到,库存显示为0):
SELECT p.code, p.description, SUM(CASE WHEN pm.type = 'in' THEN pm.quantity WHEN pm.type = 'out' THEN -pm.quantity ELSE 0 END) AS net_stock FROM products p LEFT JOIN product_movements pm ON p.code = pm.product_code GROUP BY p.code, p.description;
用上面任意一种写法,都能得到你想要的(40+20)-(10+10)=40的正确结果啦!
内容的提问来源于stack exchange,提问作者T_Sampaio
相关产品推荐
相关产品推荐

