Série da semana: Angular, API RESTful e Banco de Dados

Veja mais

REPLICANDO DADOS

11/10/2018

1

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"
   

Posts

11/10/2018

Alex Lekao

Oi Maicon,

Eu de novo. rsrsr

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

Atenciosamente,
Responder

11/10/2018

Scapatici

rsrsrsrs.

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

Então, mesmo colocando group by ele apresenta o mesmo resultado. :/
Responder

11/10/2018

Alex Lekao

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.
Responder

11/10/2018

Scapatici

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?
Responder