基于GROUP BY与HAVING的多表联查SQL需求:筛选仓库库存预警商品
解决库存不足商品的筛选问题
没问题,我来帮你实现这条需求的SELECT语句,同时拆解一下逻辑让你清楚每一步的作用:
最终SQL语句
SELECT a.artNr AS 商品编号, w.ID AS 仓库ID, a.warning AS 预警阈值, SUM(ais.quantity) AS 当前库存总量 FROM `Articles in stock` ais INNER JOIN Articles a ON ais.artID = a.ID INNER JOIN warehouse w ON ais.warehouseID = w.ID GROUP BY ais.artID, ais.warehouseID, a.artNr, a.warning, w.ID HAVING SUM(ais.quantity) <= a.warning;
逻辑拆解
表关联:
- 用
INNER JOIN把三张表关联起来:Articles in stock(缩写成ais方便书写)和Articles通过商品ID(artID=ID)关联,拿到商品的编号(artNr)和预警阈值(warning); ais和warehouse通过仓库ID(warehouseID=ID)关联,拿到仓库的信息(这里示例中仓库表只有ID,所以取这个字段)。
- 用
分组求和:
- 按
artID(商品ID)和warehouseID(仓库ID)分组,这样就能统计同一商品在同一仓库的总库存(用SUM(ais.quantity)计算)。
- 按
筛选条件:
- 用
HAVING子句筛选出总库存小于等于预警阈值的记录,因为SUM()是聚合函数,不能用WHERE来筛选聚合后的结果,所以必须用HAVING。
- 用
示例数据测试说明
你提供的示例数据里,所有商品的仓库库存总和都大于对应的预警值,所以这条语句执行后不会返回任何结果。但如果某商品在某个仓库的库存总和满足<= warning的条件,就会被筛选出来。
内容的提问来源于stack exchange,提问作者KingleyMosso
相关产品推荐
相关产品推荐

