REPLICANDO DADOS

SQL

Oracle

Banco de Dados

11/10/2018

Bom dia! Montei um select para encontrar estoque, totais de vendas por período e se teve devolução o valor que foi devolvido.
Na minha clausula where do select externo estou fazendo as comparações para me apresentar os dados, mas uma dessas comparações gera informações nulas, produtos que não tem devolução, não gera valor de devolução, então não me apresenta, mas preciso da venda desses produtos também. Tentei usar NVL para quando fosse nulo me apresentar 0, mas não obtive sucesso. Caso alguém consiga me ajudar... serei muito grato.
Segue código: *Obs.: se eu usar 'OR' ao invés de 'AND' no where do select externo ele traz todos os dados que eu preciso, o único problema é que ele replica tudo.
SELECT 
       "VEND_COD_PRO", "VEND_DESC_PRO", "VEND_TOT_VENDA", "VEND_CODVOL", "DEV_TOT_DEVOLUCAO", "EST_ESTOQUE", "VEND_TOT_VENDA" - "DEV_TOT_DEVOLUCAO" AS "TOT_LIQ_VEND"
       FROM
       (SELECT ITE.CODPROD AS "VEND_COD_PRO",  --CÓDIGO DO PRODUTO NA TELA DE ITENS
               PRO.DESCRPROD AS "VEND_DESC_PRO", -- DESCRIÇÃO DO PRODUTO NA TABELA DE PRODUTOS
               SUM(ITE.QTDNEG) AS "VEND_TOT_VENDA", -- SOMAR QUANTIDADE NEGOCIADA DA TABELA ITENS
               PRO.CODVOL AS "VEND_CODVOL" -- CÓDIGO DO VOLUME (UN DE MEDIDA) DA TABELA PRODUTO
               FROM TGFITE ITE, TGFPRO PRO, TGFCAB CAB -- ITE TABELA ITEM - PRO TABELA PRODUTO - CAB TABELA CABEÇALHO DE NOTA
               WHERE ITE.CODPROD = PRO.CODPROD
                     AND ITE.NUNOTA = CAB.NUNOTA --NUNOTA - NÚMERO ÚNICO PARA SE IDENTIFICAR UMA NOTA
                     AND PRO.MARCA IN ('MARCA1', 'MARCA2') -- MARCA DO PRODUTO NA TABELA PRODUTO
                     AND CAB.TIPMOV = 'V' -- INDICAR QUE A MOVIMENTAÇÃO DESSES PRODUTOS DEVE SER DO TIPO "VENDA"
                     AND CAB.CODTIPOPER IN (3221, 3216, 3220, 3201, 3218, 3202, 3200, 3214) --"CÓDIGO DE OPERAÇÃO DAS VENDAS QUE DEVEM APARECER"
                     AND TO_DATE(CAB.DTFATUR, 'DD/MM/YY') >= 'DATAINICIAL' -- DEFINIR PERÍODO
                     AND TO_DATE(CAB.DTFATUR, 'DD/MM/YY') <= 'DATAFINAL'
               GROUP BY 
                     ITE.CODPROD, 
                     PRO.DESCRPROD, 
                     PRO.CODVOL) "VENDA", 
 
      (SELECT ITE2.CODPROD AS "DEV_COD_PRO", -- CÓDIGO DO PRODUTO NA TABELA ITEM
              SUM(ITE2.QTDNEG) AS "DEV_TOT_DEVOLUCAO" -- SOMA DA QUANTIDADE NEGOCIADA NA TABELA ITEM
              FROM TGFITE ITE2, TGFCAB CAB2, TGFPRO PRO2 -- ITE2 TABELA ITENS - CAB2 TABELA CABEÇALHO DE NOTA - PRO2 TABELA PRODUTOS
              WHERE ITE2.NUNOTA = CAB2.NUNOTA
                    AND PRO2.CODPROD = ITE2.CODPROD
                    AND PRO2.MARCA IN ('MARCA1', 'MARCA2')
                    AND CAB2.TIPMOV = 'D' --  TIPO DO MOVIMENTO DEVOLUÇÃO DE VENDA
                    AND TO_DATE(CAB2.DTFATUR, 'DD/MM/YY') >= 'DATAINICIAL' -- DEFINIR PERÍODO
                    AND TO_DATE(CAB2.DTFATUR, 'DD/MM/YY') <= 'DATAFINAL'
              GROUP BY 
                    ITE2.CODPROD) "DEVOLUCAO",
                              
      (SELECT PRO.CODPROD AS "EST_COD_PRO", --CÓDIGO DO PRODUTO NA TABELA PRODUTO
              SUM(EST.ESTOQUE) AS "EST_ESTOQUE" -- SOMA DO ESTOQUE DA TABELA ESTOQUE
              FROM TGFEST EST, TGFPRO PRO -- EST TABELA ESTOQUE - PRO TABELA PRODUTO
              WHERE PRO.CODPROD = EST.CODPROD
                    AND PRO.MARCA IN ('MARCA1', 'MARCA2')
              GROUP BY
                    PRO.CODPROD) "ESTOQUE"                    
WHERE 
   ESTOQUE."EST_COD_PRO" = DEVOLUCAO."DEV_COD_PRO" -- COMPARAÇÕES, SE EU UTILIZAR AND AQUI ELE ME APRESENTA SOMENTE OS QUE TEM DEVOLUÇÃO, UTILIZANDO OR ELE ME TRAZ TODOS OS DADOS QUE PRECISO, MAS TODOS REPLICANDO VARIAS VEZES. É AQUI O MEU PROBLEMA
   OR ESTOQUE."EST_COD_PRO" = VENDA."VEND_COD_PRO"
ORDER BY
"VEND_DESC_PRO"
   
Maicon Scapatici

Maicon Scapatici

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

11/10/2018

Oi Maicon,

Eu de novo. rsrsr

Se vc colocar um group by não resolve seu problema?

Atenciosamente,
GOSTEI 0
Maicon Scapatici

Maicon Scapatici

11/10/2018

rsrsrsrs.

Você se empenha bastante em ajudar! Por mais pessoas como você.

Então, mesmo colocando group by ele apresenta o mesmo resultado. :/
GOSTEI 0
Alex Lekao

Alex Lekao

11/10/2018

hahaha

Vc sabe se no Oracle tem algo similar ao outer apply??

Honestamente eu nao faco ideia.

Utilizo muito no SQL Server, me ajuda bastante em analises deste tipo.
GOSTEI 0
Maicon Scapatici

Maicon Scapatici

11/10/2018

https://oraclepress.wordpress.com/2015/08/17/cross_outer_apply_clause/ parece que sim, nesse link tem explicando sobre, é o mesmo que ocorre no sql server?
GOSTEI 0
Kevlyn Godoy

Kevlyn Godoy

11/10/2018

Olá Concurseiros


Venha participar do Aniversário do Maior Site de Rateios do Brasil,

O aniversário é do Concurseiros Unidos,
mas o presente quem ganha é você!

Desconto de 30% a 70% em todo o site!
Fale que viu nosso anuncio no forum e ganha desconto adicional
Corre aproveitar antes que termine!
5541991115296
GOSTEI 0
POSTAR