Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

osvaldo.machadojr

Select from (Select...

Recommended Posts

Tenho o Select abaixo,

O problema é que existe CODPROD (CODIGO DE PRODUTO) no Select Devolucao, que nao tem no Select Vendas e vice-versa.

Do jeito que ta ai, nao aparece os CODPROD que tem no Select DEVOLUCAO mas nao tem no Select VENDAS.

eu preciso que o select puxe todos os dados de ambos os selects independente se o CODPROD existe em um ou em outro select.

Tipo, o resultado deste select me traz duas linhas:

 

CODCLI       CODPROD      VALOR          CODPRODDEVOL VLDEVOLUCAO
835	    550250	9,88915        NULL           NULL           	            	                                      
835	     14401	4,99           14401	      4,99     

 

---------------------------------------

NO ENTANDO ELE DEVERIA TRAZER TRES LINHAS, ASSIM :

 

CODCLI       CODPROD      VALOR          CODPRODDEVOL VLDEVOLUCAO
835	    550250	9,88915        NULL           NULL                                  	            	                                      
835	     14401	4,99           14401	      4,99    
835            NULL       NULL           22555        55,00     

 

Consegui explicar???

 

==============

 

 SELECT 
             VENDA.CODCLI, 
             VENDA.CODPROD,
             VENDA.VALOR,
             DEVOLUCAO.CODPROD CODPRODDEVOL,
             DEVOLUCAO.VLDEVOLUCAO
          FROM
                     (
                      SELECT PCNFSAID.CODCLI, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.QT,0)*NVL(PCMOV.PUNIT,0)) AS VALOR
                      FROM PCNFSAID, PCMOV, PCPRODUT
                      WHERE ( PCNFSAID.numtransvenda = PCMOV.numtransvenda ) 
                      AND ( PCMOV.CODPROD = PCPRODUT.CODPROD )
                      AND ( PCNFSAID.DTSAIDA BETWEEN '01-may-2011' AND '20-MAY-2011')
                      GROUP BY PCNFSAID.CODCLI, PCPRODUT.CODPROD
                     ) VENDA,

                     (
                      SELECT PCNFENT.codfornec, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.punit,0)*NVL(PCMOV.QT,0)) AS VLDEVOLUCAO
                      FROM PCNFENT, PCMOV, PCPRODUT
                      WHERE ( PCNFENT.numtransent = PCMOV.numtransent )
                      AND ( PCMOV.codprod = PCPRODUT.CODPROD )
                      AND ( PCNFENT.DTENT BETWEEN '01-MAY-2011' AND '20-MAY-2011')
                      GROUP BY PCNFENT.CODFORNEC,  PCPRODUT.CODPROD
                     ) DEVOLUCAO
          WHERE VENDA.CODCLI = DEVOLUCAO.CODFORNEC(+)
          AND   VENDA.CODPROD=DEVOLUCAO.CODPROD(+)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que basta trocar a tabela outerjoinhada...

 

SELECT 
             VENDA.CODCLI, 
             VENDA.CODPROD,
             VENDA.VALOR,
             DEVOLUCAO.CODPROD CODPRODDEVOL,
             DEVOLUCAO.VLDEVOLUCAO
          FROM
                     (
                      SELECT PCNFSAID.CODCLI, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.QT,0)*NVL(PCMOV.PUNIT,0)) AS VALOR
                      FROM PCNFSAID, PCMOV, PCPRODUT
                      WHERE ( PCNFSAID.numtransvenda = PCMOV.numtransvenda ) 
                      AND ( PCMOV.CODPROD = PCPRODUT.CODPROD )
                      AND ( PCNFSAID.DTSAIDA BETWEEN '01-may-2011' AND '20-MAY-2011')
                      GROUP BY PCNFSAID.CODCLI, PCPRODUT.CODPROD
                     ) VENDA,

                     (
                      SELECT PCNFENT.codfornec, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.punit,0)*NVL(PCMOV.QT,0)) AS VLDEVOLUCAO
                      FROM PCNFENT, PCMOV, PCPRODUT
                      WHERE ( PCNFENT.numtransent = PCMOV.numtransent )
                      AND ( PCMOV.codprod = PCPRODUT.CODPROD )
                      AND ( PCNFENT.DTENT BETWEEN '01-MAY-2011' AND '20-MAY-2011')
                      GROUP BY PCNFENT.CODFORNEC,  PCPRODUT.CODPROD
                     ) DEVOLUCAO
          WHERE VENDA.CODCLI (+)  = DEVOLUCAO.CODFORNEC
          AND   VENDA.CODPROD (+) = DEVOLUCAO.CODPROD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Motta, eu ja tentei fazer isto, só que dai acontece ao contrario em relacao ao exemplo no primeiro post.

 

 

Se fizer o que você propos, o resultado vai ficar assim, compare com o primeiro exemplo.

 

 

CODCLI       CODPROD      VALOR          CODPRODDEVOL VLDEVOLUCAO 
835          14401      4,99           14401          4,99
835            NULL       NULL           22555        55,00         

---------------------------------------

 

NO ENTANDO ELE DEVERIA TRAZER TRES LINHAS, ASSIM :

 

 

CODCLI       CODPROD      VALOR          CODPRODDEVOL VLDEVOLUCAO 
835         550250      9,88915        NULL           NULL                                                                                             
835          14401      4,99           14401          4,99     
835            NULL       NULL           22555        55,00    

 

 

 

Eu preciso que os dados de ambos os selects existam no resultado final. (-;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um duplo alter join, tente um union

 

SELECT 
             VENDA.CODCLI, 
             VENDA.CODPROD,
             VENDA.VALOR,
             DEVOLUCAO.CODPROD CODPRODDEVOL,
             DEVOLUCAO.VLDEVOLUCAO
          FROM
                     (
                      SELECT PCNFSAID.CODCLI, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.QT,0)*NVL(PCMOV.PUNIT,0)) AS VALOR
                      FROM PCNFSAID, PCMOV, PCPRODUT
                      WHERE ( PCNFSAID.numtransvenda = PCMOV.numtransvenda ) 
                      AND ( PCMOV.CODPROD = PCPRODUT.CODPROD )
                      AND ( PCNFSAID.DTSAIDA BETWEEN '01-may-2011' AND '20-MAY-2011')
                      GROUP BY PCNFSAID.CODCLI, PCPRODUT.CODPROD
                     ) VENDA,

                     (
                      SELECT PCNFENT.codfornec, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.punit,0)*NVL(PCMOV.QT,0)) AS VLDEVOLUCAO
                      FROM PCNFENT, PCMOV, PCPRODUT
                      WHERE ( PCNFENT.numtransent = PCMOV.numtransent )
                      AND ( PCMOV.codprod = PCPRODUT.CODPROD )
                      AND ( PCNFENT.DTENT BETWEEN '01-MAY-2011' AND '20-MAY-2011')
                      GROUP BY PCNFENT.CODFORNEC,  PCPRODUT.CODPROD
                     ) DEVOLUCAO
          WHERE VENDA.CODCLI = DEVOLUCAO.CODFORNEC(+)
          AND   VENDA.CODPROD=DEVOLUCAO.CODPROD(+)
union
SELECT 
             VENDA.CODCLI, 
             VENDA.CODPROD,
             VENDA.VALOR,
             DEVOLUCAO.CODPROD CODPRODDEVOL,
             DEVOLUCAO.VLDEVOLUCAO
          FROM
                     (
                      SELECT PCNFSAID.CODCLI, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.QT,0)*NVL(PCMOV.PUNIT,0)) AS VALOR
                      FROM PCNFSAID, PCMOV, PCPRODUT
                      WHERE ( PCNFSAID.numtransvenda = PCMOV.numtransvenda ) 
                      AND ( PCMOV.CODPROD = PCPRODUT.CODPROD )
                      AND ( PCNFSAID.DTSAIDA BETWEEN '01-may-2011' AND '20-MAY-2011')
                      GROUP BY PCNFSAID.CODCLI, PCPRODUT.CODPROD
                     ) VENDA,

                     (
                      SELECT PCNFENT.codfornec, PCPRODUT.CODPROD, 
                      SUM(NVL(PCMOV.punit,0)*NVL(PCMOV.QT,0)) AS VLDEVOLUCAO
                      FROM PCNFENT, PCMOV, PCPRODUT
                      WHERE ( PCNFENT.numtransent = PCMOV.numtransent )
                      AND ( PCMOV.codprod = PCPRODUT.CODPROD )
                      AND ( PCNFENT.DTENT BETWEEN '01-MAY-2011' AND '20-MAY-2011')
                      GROUP BY PCNFENT.CODFORNEC,  PCPRODUT.CODPROD
                     ) DEVOLUCAO
          WHERE VENDA.CODCLI (+)  = DEVOLUCAO.CODFORNEC
          AND   VENDA.CODPROD (+) = DEVOLUCAO.CODPROD

Não pode ser union all.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.