Как не вернуть результат, если одно значение равно нулю? - PullRequest
0 голосов
/ 08 ноября 2019

Существует вес верхнего уровня для груза, но в нем есть несколько весов для единиц обработки. Если одна из этих единиц обработки не имеет значения, то я хочу, чтобы груз не отображался в моем запросе.

Вот мой запрос -

`SELECT DISTINCT S.SHIPMENT_ID,
                            S.STATE,
                            S.CONTRACT,
                            CASE
                                WHEN H.MANUAL_GROSS_WEIGHT <> '0' THEN
                                 SUM(H.MANUAL_GROSS_WEIGHT)
                                ELSE
                                 NULL
                            END MANUAL_GROSS_WEIGHT
FROM   SHIPMENT S
JOIN   HANDLING_UNIT_SHIPMENT H
ON     H.SHIPMENT_ID = S.SHIPMENT_ID
WHERE  S.STATE = 'Preliminary'
         AND S.CONTRACT = 'BVL10'
         AND H.MANUAL_GROSS_WEIGHT <> '0'
GROUP  BY S.SHIPMENT_ID,
                S.STATE,
                S.CONTRACT,
                H.MANUAL_GROSS_WEIGHT`

Возвращает 123, поскольку в настоящее время существует дваящики, один с ручным весом 123 и один с 0.

Этот груз не должен возвращаться вообще, поскольку один из ручных весов равен 0.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Если вы измените JOIN на LEFT JOIN и включите H.MANUAL_GROSS_WEIGHT <> '0' в условие JOIN, то, сравнив количество строк из SHIPMENT с числом из HANDLING_UNIT_SHIPMENT, вы сможете увидеть, какие партии имелинулевые веса отсутствуют (так как число будет одинаковым):

SELECT DISTINCT S.SHIPMENT_ID,
                            S.STATE,
                            S.CONTRACT,
                            SUM(H.MANUAL_GROSS_WEIGHT) MANUAL_GROSS_WEIGHT
FROM   SHIPMENT S
JOIN   HANDLING_UNIT_SHIPMENT H
ON     H.SHIPMENT_ID = S.SHIPMENT_ID AND H.MANUAL_GROSS_WEIGHT <> '0'
WHERE  S.STATE = 'Preliminary'
         AND S.CONTRACT = 'BVL10'       
GROUP  BY S.SHIPMENT_ID,
          S.STATE,
          S.CONTRACT
HAVING COUNT(S.SHIPMENT_ID) = COUNT(H.SHIPMENT_ID)

Обратите внимание, что это позволяет удалить выражение CASE, так как оно будет возвращать только отправления, для которых все значения MANUAL_GROSS_WEIGHT отличны от нуля.

0 голосов
/ 08 ноября 2019

Я бы не стал использовать LEFT JOIN для этого. Я бы просто использовал предложение HAVING. Предполагая, что веса никогда не бывают отрицательными:

SELECT S.SHIPMENT_ID, S.STATE, S.CONTRACT,
       SUM(H.MANUAL_GROSS_WEIGHT) as MANUAL_GROSS_WEIGHT
FROM SHIPMENT S JOIN
     HANDLING_UNIT_SHIPMENT H
     ON H.SHIPMENT_ID = S.SHIPMENT_ID 
WHERE S.STATE = 'Preliminary' AND S.CONTRACT = 'BVL10'       
GROUP BY S.SHIPMENT_ID, S.STATE, S.CONTRACT
HAVING MIN(H.MANUAL_GROSS_WEIGHT) > 0;

Если вес может быть 0, а у вас отрицательные значения, тогда:

HAVING SUM(CASE WHEN H.MANUAL_GROSS_WEIGHT = 0 THEN 1 ELSE 0 END) = 0

Обратите внимание, что SELECT DISTINCT почти никогда не используетсяс GROUP BY. В этом запросе он не нужен.

РЕДАКТИРОВАТЬ:

Если вы хотите отфильтровать любой груз, который имеет NULL вес:

HAVING COUNT(H.MANUAL_GROSS_WEIGHT) = COUNT(*)

Это требуетчтобы все были не NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...