You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Access技术问询:如何通过SQL计算库存数量与已订购数量的差值

没问题,我来帮你搞定用销售数据扣减商品库存的需求!

解决思路:批量扣减商品库存

你已经能分别拿到每个商品的订购数量和当前库存,接下来只需要把这两组数据关联起来,执行批量更新操作就行。

第一步:确认已有查询

你用来统计每个商品订购数量的SQL:

SELECT SALES.PRODUCT_ID AS ORDERED_ID, COUNT(SALES.PRODUCT_ID) AS ORDERED 
FROM SALES 
GROUP BY SALES.PRODUCT_ID

执行结果:

ORDERED_IDORDERED
12012
12022
12042
12053
12061
12072
12081
12091
12103

获取商品库存的完整SQL(补全你未写完的部分):

SELECT PRODUCT.PRODUCT_ID AS INVEN_ID, PRODUCT.QUANTITY AS INVEN 
FROM PRODUCT

第二步:执行库存扣减的UPDATE语句

这里推荐用UPDATE JOIN的方式,既高效又直观,能直接关联两个表完成批量更新:

UPDATE PRODUCT
JOIN (
    SELECT PRODUCT_ID, COUNT(*) AS ORDERED 
    FROM SALES 
    GROUP BY PRODUCT_ID
) AS sales_summary ON PRODUCT.PRODUCT_ID = sales_summary.PRODUCT_ID
SET PRODUCT.QUANTITY = PRODUCT.QUANTITY - sales_summary.ORDERED
-- 可选:添加这个条件避免库存变成负数,适合不允许超卖的场景
WHERE PRODUCT.QUANTITY >= sales_summary.ORDERED;

如果你的数据库不支持UPDATE JOIN(比如部分版本的SQLite),也可以用子查询的方式实现:

UPDATE PRODUCT
SET QUANTITY = QUANTITY - (
    SELECT COUNT(*) 
    FROM SALES 
    WHERE SALES.PRODUCT_ID = PRODUCT.PRODUCT_ID
)
WHERE EXISTS (
    SELECT 1 
    FROM SALES 
    WHERE SALES.PRODUCT_ID = PRODUCT.PRODUCT_ID
);

额外建议

  • 没有销售记录的商品,上面的语句不会修改它们的库存,这是合理的逻辑(无订购则无需扣减)。
  • 执行更新前,建议先运行下面的查询验证扣减结果,确保逻辑正确后再执行更新:
SELECT 
    PRODUCT.PRODUCT_ID,
    PRODUCT.QUANTITY AS 原库存,
    sales_summary.ORDERED AS 已订购数量,
    PRODUCT.QUANTITY - sales_summary.ORDERED AS 扣减后库存
FROM PRODUCT
JOIN (
    SELECT PRODUCT_ID, COUNT(*) AS ORDERED 
    FROM SALES 
    GROUP BY PRODUCT_ID
) AS sales_summary ON PRODUCT.PRODUCT_ID = sales_summary.PRODUCT_ID;

内容的提问来源于stack exchange,提问作者Blu

火山引擎 最新活动