Как заменить нулевые значения своим собственным значением с помощью комбинации - PullRequest
0 голосов
/ 02 апреля 2020

Я работаю над запросом в Oracle. Я использую таблицу фактов для идентификатора контракта и измерения для продукта и материала. Мне нужно иметь решение в запросе вместо базы данных.

У меня есть пример вывода результатов, где некоторые из идентификаторов контрактов имеют нулевые значения.

Я не могу жестко закодировать значения NULL, потому что У меня есть много других идентификаторов контрактов в таблице.

Каждый уникальный идентификатор контракта имеет один идентификатор продукта, а каждый продукт имеет несколько материалов. Я хотел бы заменить идентификаторы NULL-контракта на 17270 в сочетании с указанным c продуктом PR000349059 и материалами. Таким образом, каждое значение NULL для идентификатора контракта заменяет его собственным значением.

select
    fvpo_vpa_id     contract_id,
    dsai_prpr_sap_matnr    product_ID,
    dsai_sp_sap_matnr       material_ID,
    fvpo_quantity           quantity
from vpa_sp right outer join
     PP_SP
     on fvpo_dsai_id = dsai_id

enter image description here

RESUlT:

 CONTRACT_ID PRODUCT_ID MATERIAL_ID QUANTITY
    17270   PR000349059 SP000748364 1962898
    17270   PR000349059 SP000748366 2589732
    17270   PR000349059 SP000748370 5565604
            PR000349059 SP000010709 
            PR000349059 SP000748128 
            PR000349059 SP000748130 
            PR000349059 SP000748132 
            PR000349059 SP000748362 

1 Ответ

0 голосов
/ 03 апреля 2020

Хорошо, основываясь на ваших изменениях и комментариях, я думаю, что понимаю, что вы ищете. В случае, если CONTRACT_ID равно NULL, заполните его CONTRACT_ID из другого ряда с такими же PRODUCT_ID и NOT NULL CONTRACT_ID. Этот запрос поможет вам достичь этого:

SELECT NVL(fvpo_vpa_id, MIN(fvpo_vpa_id) OVER (PARTITION BY dsai_prpr_sap_matnr)) contract_id,
       dsai_prpr_sap_matnr product_ID,
       dsai_sp_sap_matnr   material_ID,
       fvpo_quantity       quantity
FROM   vpa_sp
RIGHT  OUTER JOIN pp_sp ON fvpo_dsai_id = dsai_id;

Это заменит CONTRACT_ID только в том случае, если это NULL, и мы сможем найти другую строку с таким же заполненным PRODUCT_ID. Это основано на предположении, что вы упомянули, что каждый CONTRACT_ID должен иметь только один PRODUCT_ID

...