Access技术问询:如何通过SQL计算库存数量与已订购数量的差值
没问题,我来帮你搞定用销售数据扣减商品库存的需求!
解决思路:批量扣减商品库存
你已经能分别拿到每个商品的订购数量和当前库存,接下来只需要把这两组数据关联起来,执行批量更新操作就行。
第一步:确认已有查询
你用来统计每个商品订购数量的SQL:
SELECT SALES.PRODUCT_ID AS ORDERED_ID, COUNT(SALES.PRODUCT_ID) AS ORDERED FROM SALES GROUP BY SALES.PRODUCT_ID
执行结果:
| ORDERED_ID | ORDERED |
|---|---|
| 1201 | 2 |
| 1202 | 2 |
| 1204 | 2 |
| 1205 | 3 |
| 1206 | 1 |
| 1207 | 2 |
| 1208 | 1 |
| 1209 | 1 |
| 1210 | 3 |
获取商品库存的完整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




