仅当第2列包含全部为

时间:2017-02-14 18:28:52

标签: sql tsql ssms

在我的t-SQL数据库中,我有一个ItemLocation表。它列出仓库,仓库中的存储位置,存储在这些位置的物料以及当前的库存数量。见下文 -

enter image description here

仓库(whse)可以有多个位置,一个位置可以有多个项目。正如您从图像中看到的那样,有些地方的项目有' 0' qty_on_hand。

我想要做的是编写一个只返回绝对没有qty_on_hand的位置的查询。例如,我的图像中突出显示的位置(01-00-00A)将不会出现在执行查询的结果集中,因为它包含具有数量的项目。我只对那些没有任何数量的商品感兴趣。

SELECT  itemloc.*
FROM itemloc
WHERE itemloc.qty_on_hand = '0'
AND whse IN ('MW10','MW40','MW60')
ORDER BY whse, itemloc.loc

我的查询描述了qty_on_hand should =' 0',但我不希望qty_on_hand等于' 0',因为它会返回每个有项目的位置没有库存。我无法弄清楚我的查询对于这种情况会是什么样子。

3 个答案:

答案 0 :(得分:1)

假设qty只能是0或正值,您可以使用聚合来查找该位置的最大值是否为0.

select loc
from itemloc
group by loc
having max(qty) = 0

如果它也可能是否定的,那么也使用min:

select loc
from itemloc
group by loc
having max(qty) = 0 and min(qty) = 0

如果您想获得其他列,也可以使用:

select *
from itemloc
where loc in (
        select loc
        from itemloc
        group by loc
        having max(qty) = 0
        );

或窗口功能:

select *
from (
    select
        i.*,
        max(qty) over (partition by loc) max_qty
    from itemloc i
) t where max_qty = 0;

答案 1 :(得分:1)

您可以创建具有location&gt;的任何qty_on_hand / SELECT a.* FROM itemloc a LEFT JOIN (select distinct whse,location from itemloc where qty_on_hand <> '0') b ON a.whse = b.whse AND a.location = b.location WHERE b.whse IS NULL 组合的子集0(对于任何项目),并返回该子集中未包含的结果。

{{1}}

答案 2 :(得分:0)

SELECT  *
FROM    itemloc
WHERE
    loc IN
    (
        SELECT      loc
        FROM        itemloc
        GROUP BY    qty_on_hand
        HAVING      SUM(qty_on_hand) = '0'
    )