Duplicando registros !

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 04 Fev 2020 1:42 pm

Prezados, boa tarde !

Desenvolvemos um relatório onde trás itens fabricados/modelo por exemplo :

ANO_FAB | ANO_MOD
2018. 2019
2019. 2020
2020. 2020

Porem o saldo que vem esta buscando somente de um período.

Como esta :
Imagem


Como tem que ser :
Imagem

Para isso estamos usando a seguinte quero :

Código: Selecionar todos
select  DISTINCT mmt.inventory_item_id ,
     -----   
         rtrim ( msib.segment1,' ')        MATERIAL,
         rtrim ( msib.description, ' ')   DESCRICAO,
     -----
         msn.attribute2    ANO_FAB,
         mde.element_value ANO_MOD,
       
        (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND   mmt1.subinventory_code = 'KMB_EXP') SUB_EXP,
       
        (SELECT SUM(NVL(mmt1.reservation_quantity,0))
        FROM mtl_reservations mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id) RESERVA,
       
       (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_EXP') -
     
       (SELECT SUM(NVL(mmt1.reservation_quantity,0))
        FROM mtl_reservations mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id) SALDO_EXP,
     
       (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_CTMA') SUB_CTMA,
     
       (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_CQTB') SUB_CQTB,
     
      ( (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_EXP') -
     
        NVL((SELECT SUM(NVL(mmt1.reservation_quantity,0))
        FROM mtl_reservations mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id) ,0)+
     
        NVL( (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_CTMA'),0)+
       
        NVL( (SELECT SUM(NVL(mmt1.transaction_quantity,0))
        FROM  MTL_ONHAND_QUANTITIES mmt1
        WHERE mmt1.inventory_item_id = mmt.inventory_item_id
        AND mmt1.subinventory_code = 'KMB_CQTB'),0)) TOTAL       
     
FROM
       mtl_onhand_quantities       mmt
     , mtl_system_items_b          msib
     , mtl_serial_numbers          msn
     , mtl_descr_element_values     mde
where mmt.inventory_item_id       = msib.inventory_item_id
and   mmt.organization_id         = msib.organization_id
and   mmt.inventory_item_id       = msn.inventory_item_id
and   mmt.inventory_item_id       = mde.inventory_item_id
and   mde.element_name =              'ANO/MOD'
--and   mmt.inventory_item_id     in (16132 ,  16120,  16121)
ORDER BY 1


Alguém pode ajudar nesse caso ?
LucianoSilva

Mensagemem Ter, 04 Fev 2020 6:44 pm

Isso está acontecendo porque o seu SALDO está sendo buscado apenas pelo INVENTORY_ITEM_ID.
Você não está considerando o ANO e MODELO nos sub-selects.
Teria que colocar essas informação DENTRO das suas sub-queries e filtrar baseado na tabela de fora.

Mas eu faria a sua query totalmente diferente.
Mais ou menos assim:
Código: Selecionar todos
select   mmt.inventory_item_id ,
     -----   
         rtrim ( msib.segment1,' ')        MATERIAL,
         rtrim ( msib.description, ' ')   DESCRICAO,
     -----
         msn.attribute2    ANO_FAB,
         mde.element_value ANO_MOD,
       
      sum(   decode(mmt.SUBINVENTORY_CODE, 'KMB_EXP', NVL(mmt.transaction_quantity,0), 0) ) SUB_EXP
    -- SUM( NVL(mmt.reservation_quantity,0)   )RESERVA
    , sum(   decode(mmt.SUBINVENTORY_CODE, 'KMB_CTMA', NVL(mmt.transaction_quantity,0), 0) ) SUB_CTMA
    , sum(   decode(mmt.SUBINVENTORY_CODE, 'KMB_CQTB', NVL(mmt.transaction_quantity,0), 0) ) SUB_CQTB
   
FROM
       mtl_onhand_quantities       mmt
     , mtl_system_items_b          msib
     , mtl_serial_numbers          msn
     , mtl_descr_element_values     mde
where mmt.inventory_item_id       = msib.inventory_item_id
and   mmt.organization_id         = msib.organization_id
and   mmt.inventory_item_id       = msn.inventory_item_id
and   mmt.inventory_item_id       = mde.inventory_item_id
and   mde.element_name =              'ANO/MOD'
--and   mmt.inventory_item_id     in (16132 ,  16120,  16121)
GROUP BY
mmt.inventory_item_id , 
         rtrim ( msib.segment1,' ')       ,
         rtrim ( msib.description, ' ') ,
         msn.attribute2    ,
         mde.element_value 
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Qua, 05 Fev 2020 3:59 pm

Entendi...
Vou verificar aqui e retorno... Mas muito obrigado pela dica... já ajudou bastante.
LucianoSilva



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes