Получить запись для ключа, но отобразить значение для отдельного ключа в DB2 SQL - PullRequest
0 голосов
/ 10 июля 2020

Итак, у меня есть таблица с составным первичным ключом для SHIP # и REF #. Каждый SHIP # имеет два кода для REF #: BM и PO. Поле BM является обязательным, но поле PO заполняется только тогда, когда пользователь действительно что-то вводит. Итак, при выборе basi c будет отображаться что-то вроде этого:

SHIP#           REF#    VALUE
000002          BM      20001836                      
000002          PO      020                           
000003          BM      20001834                      
000003          PO      8-694                         
000004          BM      20001835                      

Теперь вы заметите, что отправление 000004 имеет только BM и не содержит PO.

Я хочу отобразить все отгрузки со значениями ПО. Итак, если значение PO пусто или не существует, как в случае «000004», следует просто поставить «-». Поскольку BM является обязательным, вам нужно будет получить все записи, в которых существует BM, но отображаемое значение поля PO.

Итак, вывод должен быть:

SHIP#           REF#    VALUE                     
000002          PO      020                           
000003          PO      8-694                         
000004          PO      -  

Сообщите мне, если вам нужны дополнительные пояснения. Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Внешнее соединение против самого себя тоже может выполнить эту работу. Например:

select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM'

Результат:

SHIP    REF  VALUE
------  ---  -----
000002  PO   020
000003  PO   8-694
000004  PO   -

См. Рабочий пример на db <> fiddle .

EDIT - Найти только BM без PO.

Вы можете использовать тот же запрос и добавить в него дополнительный предикат and b.ship is null, например:

select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM' 
  and b.ship is null

Результат:

SHIP    REF  VALUE 
------- ---- ----- 
000004  PO   -     

См. Рабочий пример на db <> fiddle .

2 голосов
/ 10 июля 2020

Вы можете использовать агрегирование:

select ship#, 'PO' as ref#,
       max(case when ref# = 'PO' then value end) as value 
from t
group by ship#

Это возвращает value как NULL - что кажется очень хорошим выбором. Если вы действительно хотите '-', используйте COALESCE():

select ship#, 'PO' as ref#,
       coalesce(max(case when ref# = 'PO' then value end), '-') as value 
from t
group by ship#
...