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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:42