You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:10:46