2017-02-14 9 views
0

В моем t-SQL db у меня есть таблица ItemLocation. В нем перечислены склады, места хранения в складах, предметах, хранящихся в этих местах, и текущих количествах под рукой. Ниже -Столбец возврата1, только если столбец 2 содержит все нули

enter image description here

склад (товарный склад) может иметь несколько мест и место может иметь несколько элементов. Как видно из изображения, в местах, где есть «0» qty_on_hand, есть элементы.

Что я хотел бы сделать, это написать запрос, который возвращает только те объекты, у которых нет NO qty_on_hand. Например, выделенное место в моем изображении (01-00-00A) не будет присутствовать в результирующем наборе выполненного запроса, поскольку содержит элементы, которые do имеют количество. Меня интересуют только те местоположения, которые не имеют никакого количества для какого-либо элемента.

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

Мой запрос изображает qty_on_hand должно = «0», но я не хочу, чтобы qty_on_hand равного «0», потому что тогда он будет возвращать каждое место, которое имеет объект без описи. Я не могу понять, как будет выглядеть мой запрос для этой ситуации.

+0

У вас есть склад таблицы? Если это так, вам нужно будет использовать это как свою базовую таблицу. – bernie

+0

bernie Да, я знаю. –

ответ

1

Предполагая, что Qty может быть только 0 или положительное значение, вы можете использовать агрегацию, чтобы найти, если максимальное значение для этого места является 0.

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

, если он может быть отрицательным слишком, а затем использовать мин, а также:

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; 
+0

Извините за задержанный ответ - Надо было отойти от моего стола. Группировка по loc с max (qty) = 0 работала для меня. Спасибо вам за помощь. –

+0

@ Энтони Рад помогал. – GurV

1

Вы можете создать подмножество любого whse/location комбо, который имеет qty_on_hand> 0 (для любого элемента), и возвратить результаты, не включенные в этой подгруппе.

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
SELECT * 
FROM itemloc 
WHERE 
    loc IN 
    (
     SELECT  loc 
     FROM  itemloc 
     GROUP BY qty_on_hand 
     HAVING  SUM(qty_on_hand) = '0' 
    )