Oracle GROUP BY查询问题:筛选特定仓库库存的SKU记录
解决Oracle GROUP BY与多WHERE子句的查询问题
咱们先拆解下你当前查询的核心问题:
1. WHERE子句逻辑完全矛盾
你的WHERE条件写的是(WhseId = 1 AND Qty < 1) AND (WhseId = 2 AND Qty > 0) AND (WhseId = 3 AND Qty > 0)——但单条记录的WhseId只能是一个值啊!一条记录不可能同时属于仓库1、2、3,这个条件永远不会匹配到任何数据,这是最根本的问题。
2. GROUP BY用错了场景
你对Sku, WhseId, Qty分组,本质上就是把每条记录单独当成一组,完全没利用GROUP BY的聚合能力来判断同一个SKU在不同仓库的库存情况,分组操作在这里毫无意义。
正确的解法思路
我们需要先筛选出符合所有仓库条件的SKU,再关联原表拿到这些SKU的所有仓库记录。这里用GROUP BY + HAVING结合聚合函数来判断每个SKU的全局条件是最直接的方式:
第一步:找出符合条件的SKU
SELECT Sku FROM PRODUCTS GROUP BY Sku HAVING -- 确保该SKU在仓库1的库存为0 SUM(CASE WHEN WhseId = 1 THEN Qty ELSE 0 END) = 0 -- 确保仓库2的库存大于0 AND SUM(CASE WHEN WhseId = 2 THEN Qty ELSE 0 END) > 0 -- 确保仓库3的库存大于0 AND SUM(CASE WHEN WhseId = 3 THEN Qty ELSE 0 END) > 0;
第二步:关联原表拿到完整记录
如果需要返回这些SKU对应的所有仓库明细,就把上面的结果作为子查询和原表关联:
SELECT p.Sku, p.WhseId, p.Qty FROM PRODUCTS p INNER JOIN ( SELECT Sku FROM PRODUCTS GROUP BY Sku HAVING SUM(CASE WHEN WhseId = 1 THEN Qty ELSE 0 END) = 0 AND SUM(CASE WHEN WhseId = 2 THEN Qty ELSE 0 END) > 0 AND SUM(CASE WHEN WhseId = 3 THEN Qty ELSE 0 END) > 0 ) valid_skus ON p.Sku = valid_skus.Sku ORDER BY p.Sku, p.WhseId;
这个查询会精准返回你想要的结果:
Sku WhseId Qty ======================== XYZ-789 1 0 XYZ-789 2 1 XYZ-789 3 3
内容的提问来源于stack exchange,提问作者PixelPaul
相关产品推荐
相关产品推荐

