Oracle按交易类型求和与减法运算,实现商品库存结存查询
Oracle店铺库存结存量计算方案
嘿,我来帮你搞定这个库存计算的问题!首先咱们先明确下交易表的常见结构(如果你的表字段不一样,直接替换对应字段名就行):
假设你的交易表叫store_transactions,包含以下核心字段:
product_id:商品唯一标识transaction_type:交易类型,值为MR(入库)或SR(出库)quantity:交易的商品数量(默认是正数,入库加、出库减)
核心计算逻辑
最终库存的本质就是所有入库数量总和减去所有出库数量总和,用Oracle的聚合函数结合条件判断就能轻松实现,具体SQL如下:
SELECT product_id, SUM(CASE WHEN transaction_type = 'MR' THEN quantity WHEN transaction_type = 'SR' THEN -quantity ELSE 0 END) AS final_stock FROM store_transactions GROUP BY product_id ORDER BY product_id;
扩展:包含初始库存的场景
如果你还有一张商品基础信息表(比如products),里面存了每个商品的初始库存initial_stock,可以关联两张表计算最终库存:
SELECT p.product_id, p.product_name, -- 如果有商品名称字段可加上 p.initial_stock + COALESCE(t.transaction_total, 0) AS final_stock FROM products p LEFT JOIN ( SELECT product_id, SUM(CASE WHEN transaction_type = 'MR' THEN quantity WHEN transaction_type = 'SR' THEN -quantity ELSE 0 END) AS transaction_total FROM store_transactions GROUP BY product_id ) t ON p.product_id = t.product_id ORDER BY p.product_id;
这里用COALESCE()是为了处理那些没有任何交易记录的商品,避免初始库存因为NULL值变成无效结果。
几个注意点
- 如果你的出库记录里
quantity存的是负数,直接把CASE里的-quantity改成quantity即可 - 要过滤特定时间范围的交易?在主查询或子查询里加
WHERE transaction_date BETWEEN '起始日期' AND '结束日期'就行(假设你有transaction_date字段) - 有其他交易类型的话,要么在CASE里补充对应逻辑,要么用
ELSE 0忽略不相关类型
内容的提问来源于stack exchange,提问作者Nurat Jahan
相关产品推荐
相关产品推荐

