Нужна помощь в суммировании подзапроса SQL - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно показать общее количество контейнеров, которые расположены в разных зонах размещения на складе. Проблема в том, что существует 3 этапа данных: ПУНКТЫ, КОНТЕЙНЕРЫ (полные ящики и лотки) и ПОДДОНЫ.

ПОДДОНЫ ИМЕЮТ идентификатор контейнера, но НЕТ местоположения,

КОНТЕЙНЕРЫ ПОЛНОГО СЛУЧАЯ ИМЕЮТ идентификатор контейнера и ИМЕЮТ местоположение, ЛОТКОВЫЕ КОНТЕЙНЕРЫ ИМЕЮТ идентификатор контейнера, но НЕ имеют места, ПУНКТЫНе иметь идентификатор контейнера, но иметь место.

Я могу легко найти местоположение ПОЛНЫХ КОНТЕЙНЕРОВ

Select 
      sc.location 
from  
       shipping_container 
where 
       container_class = 'carton'

Однако, это не вернет местоположение для ПОДДЕРЖКИ КОНТЕЙНЕРОВ

Я не могу найти местоположение ЛОТКАКОНТЕЙНЕР, связав поле PARENT (ITEM) с INTERNAL_CONTAINER_NUM (КОНТЕЙНЕР ЛОТКА)

Я могу получить список всех местоположений КОНТЕЙНЕРА, используя этот код:

coalesce((select    
                TOP 1 item2.location
            from shipping_container item2
            where item2.item is not null and
                    item2.parent = parent.internal_container_num),(select   
                TOP 1 item2.location
            from shipping_container item2
            where item2.item is not null and
                    item2.parent = item.internal_container_num),'Not Located') 'Location'

была внешняя внутренняя границаjoin

From
    shipping_container item
        inner join shipping_container parent
            on item.parent = parent.internal_container_num

Но когда я пытаюсь выполнить оператор SUM (CASE для суммирования общего числа в заданном местоположении, мне не разрешается выполнять агрегирование по подзапросу.

sum( CASE WHEN sc.container_class ='carton' and sc.status ='650' and  sc.location not in ('CRT2','Z19') and sc.location not like 'AFT%' and sc.location not like 'INT%' THEN 1 ELSE 0 END) 'Loading-Dock',
sum( CASE WHEN sc.container_class ='carton' and sc.status ='650' and  (sc.location  in ('CRT2','Z19') or sc.location  like 'AFT%' or sc.location like 'INT%') THEN 1 ELSE 0 END) 'Loading-Prod',
sum( CASE WHEN sc.container_class ='carton' and sc.status ='650' and  sc.location  is null THEN 1 ELSE 0 END) 'Loading-No Loc

Исходящие соединения для этого:

shipment_detail sd
        left join SHIPMENT_HEADER sh
            on sd.SHIPMENT_ID = sh.SHIPMENT_ID
        left join SHIPPING_CONTAINER sc
            on sc.INTERNAL_SHIPMENT_LINE_NUM = sd.INTERNAL_SHIPMENT_LINE_NUM
        left join shipping_container parent
            on sc.parent = parent.INTERNAL_CONTAINER_NUM

Этот метод учитывает только факторы в КОНТЕЙНЕРАХ ПОЛНОГО КОНТЕЙНЕРА и ВСЕХ ЛОТОКОВЫХ КОНТЕЙНЕРОВ в конечном итоге в состоянии «Загрузка без местоположения», поскольку уровень КОНТЕЙНЕРА не имеет местоположения.

Я хочу существенно заменить часть SC.LOCATION в моем операторе SUM (CASE на код объединения).

Есть ли способ решить эту проблему?

...