Dificuldade Left Join Oracle 10G

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
jorginho19
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 05 Mai 2009 11:03 am
Localização: Uberaba
ATT
Jorge Gonçalves Filho
Tecnico em Informática
jorge@globalcosmeticos.com.br

Bom dia a todos, estou com o seguinte problema no oracle 10G. Ao executar o comando abaixo, como resultado apresenta somente os itens que tem relacionado nas duas tabelas e preciso que apresente todos os representantes mesmo se ele não tiver pedido. A forma que estou fazendo esta correta?

Selecionar tudo

SELECT R.NMREPRES AS NOME  , NVL(COUNT(P.NRPEDIDO), 0) AS TOTAL
FROM REPRESENTANTE R, PEDIDO P
WHERE R.CDREPRES (+) =  P.CDREPRES AND
      P.STPEDIDO     = 'P'
GROUP BY R.NMREPRES
ATT
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Está invertido!

Selecionar tudo

SELECT R.NMREPRES AS NOME  , NVL(COUNT(P.NRPEDIDO), 0) AS TOTAL
FROM REPRESENTANTE R, PEDIDO P
WHERE R.CDREPRES =  P.CDREPRES(+)  
   AND P.STPEDIDO     = 'P'
GROUP BY R.NMREPRES
Caso não tenha pedido, então o (+) tem que estar nele.
Avatar do usuário
jorginho19
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 05 Mai 2009 11:03 am
Localização: Uberaba
ATT
Jorge Gonçalves Filho
Tecnico em Informática
jorge@globalcosmeticos.com.br

Coloquei assim e tambem não funcionou!

Selecionar tudo

SELECT R.NMREPRES AS NOME  , NVL(COUNT(P.NRPEDIDO), 0) AS TOTAL

FROM REPRESENTANTE R, PEDIDO P

WHERE R.CDREPRES  =  P.CDREPRES (+) AND
      P.STPEDIDO     = 'P'

GROUP BY R.NMREPRES
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Tem razão.
É que você está filtrando o P também.
Então tem que colocar assim:

Selecionar tudo

SELECT R.NMREPRES AS NOME  , NVL(COUNT(P.NRPEDIDO), 0) AS TOTAL
FROM REPRESENTANTE R, PEDIDO P
WHERE R.CDREPRES =  P.CDREPRES(+) 
   AND P.STPEDIDO(+)     = 'P'
GROUP BY R.NMREPRES
Em todos os campos do P.
Avatar do usuário
jorginho19
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 05 Mai 2009 11:03 am
Localização: Uberaba
ATT
Jorge Gonçalves Filho
Tecnico em Informática
jorge@globalcosmeticos.com.br

Funcionou beleza, muitissimo obrigado!
Cilso
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 28 Abr 2009 1:35 pm
Localização: Araraquara-SP

Pessoal,

Apenas como informação, fiz um teste em duas de minhas tabelas e o resultado foi mais rápido:

Selecionar tudo

  SELECT R.NMREPRES AS NOME  , NVL(COUNT(P.NRPEDIDO), 0) AS TOTAL 
FROM REPRESENTANTE R LEFT JOIN PEDIDO P ON (R.CDREPRES =  P.CDREPRES AND P.STPEDIDO = 'P' )
GROUP BY R.NMREPRES
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Provavelmente foi mais rapido porque na segunda tentativa os blocos estavam em cache.
Avatar do usuário
jorginho19
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 05 Mai 2009 11:03 am
Localização: Uberaba
ATT
Jorge Gonçalves Filho
Tecnico em Informática
jorge@globalcosmeticos.com.br

Se alguém puder me ajudar a primeira pregunta foi uma das duvidas para fazer a sql abaixo funcionar e a mesma esta me fazendo quebrar a cabeça, se o representante fez pedido beleza mais os que não fizeram pedido ainda não aparecem! alguém pode me ajudar?

Selecionar tudo

SELECT R.CDSUPERV, R.CDREPRES, R.NMREPRES, 
       COUNT(DISTINCT(PR.CDPRODUT)) AS MIX_ATENDIDO,
       (SELECT COUNT(DISTINCT(P.CDPRODUT) )
       FROM PRODUTO P, FORNECEDOR F, LIVPRECO L
       WHERE F.CDFORNEC = 57708       AND
            F.CDFORNEC = P.CDFABRIC   AND
            P.CDPRODUT = L.CDPRODUT   AND
            L.NRSEMANA >= (200902)    AND
            L.NRSEMANA <= (200915)
       ) AS MIX_TOTAL,
       COUNT(DISTINCT(P.CDCLIENT)) AS CLIENTES_ATENDIDOS,
       (SELECT COUNT(C.CDCLIENT)
        FROM CLIENTE C, ZONEMPRESA Z
        WHERE R.CDREPRES = Z.CDREPRES AND
              C.STLIBERA = 'S'        AND
              C.CDZONA  = Z.CDZONA    
       ) AS CLIENTES_TOTAL,
       ROUND(SUM(I.QTAPROVA * I.VRUNITAR),2)AS VENDAS_TOTAL      
        
FROM   REPRESENTANTE R, PEDIDO P, ITEPEDIDO I, FORNECEDOR F, PRODUTO PR
        
WHERE  R.CDSUPERV  NOT IN (191,100)                           AND
       F.CDFORNEC      =  57708                               AND
       F.CDFORNEC      =  PR.CDFABRIC                         AND
       R.CDREPRES      =  P.CDREPRES  (+)                     AND
       P.STPEDIDO  (+) =  'F'                                 AND
       P.NRPEDIDO      =  I.NRPEDIDO                          AND
       P.CDEMPRES      =  I.CDEMPRES                          AND
       P.DTPEDIDO      >= TO_DATE('14/01/2009', 'DD/MM/YYYY') AND
       P.DTPEDIDO      <= TO_DATE('18/04/2009', 'DD/MM/YYYY') AND
       PR.CDPRODUT     =  I.CDPRODUT                                
GROUP BY R.CDSUPERV, R.CDREPRES, R.NMREPRES

ORDER BY R.CDSUPERV, R.NMREPRES
Avatar do usuário
jorginho19
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 05 Mai 2009 11:03 am
Localização: Uberaba
ATT
Jorge Gonçalves Filho
Tecnico em Informática
jorge@globalcosmeticos.com.br

So a nivel de curiosidade esta ai a resposta!

Selecionar tudo

SELECT R.CDSUPERV, R.CDREPRES, R.NMREPRES, 
       COUNT(DISTINCT(PR.CDPRODUT)) AS MIX_ATENDIDO,
       (SELECT COUNT(DISTINCT(P.CDPRODUT) )
       FROM PRODUTO P, FORNECEDOR F, LIVPRECO L
       WHERE F.CDFORNEC = 57708       AND
            F.CDFORNEC = P.CDFABRIC   AND
            P.CDPRODUT = L.CDPRODUT   AND
            L.NRSEMANA >= (200902)    AND
            L.NRSEMANA <= (200915)
       ) AS MIX_TOTAL,
       COUNT(DISTINCT(P.CDCLIENT)) AS CLIENTES_ATENDIDOS,
       (SELECT NVL(COUNT(C.CDCLIENT),0)
        FROM CLIENTE C, ZONEMPRESA Z
        WHERE R.CDREPRES = Z.CDREPRES AND
              C.STLIBERA = 'S'        AND
              C.CDZONA  = Z.CDZONA    
       ) AS CLIENTES_TOTAL,
       ROUND(NVL(SUM(I.QTAPROVA * I.VRUNITAR),0),2) AS VENDAS_TOTAL      
        
FROM   REPRESENTANTE R, PEDIDO P, ITEPEDIDO I, FORNECEDOR F, PRODUTO PR
        
WHERE  R.CDSUPERV  NOT IN (191,100)                           AND
       R.STREPRES       =  'A'                                AND
       R.CDEQUREP       =  1                                  AND
       R.CDREPRES       =  P.CDREPRES (+)                     AND
       P.STPEDIDO  (+)  =  'F'                                AND
       P.NRPEDIDO       =  I.NRPEDIDO (+)                     AND
       P.CDEMPRES       =  I.CDEMPRES (+)                     AND
       P.DTPEDIDO  (+) >= TO_DATE('14/01/2009', 'DD/MM/YYYY') AND
       P.DTPEDIDO  (+) <= TO_DATE('18/04/2009', 'DD/MM/YYYY') AND
       PR.CDPRODUT (+)  =  I.CDPRODUT                         AND
       F.CDFORNEC  (+)  =  57708                              AND
       F.CDFORNEC  (+)  =  PR.CDFABRIC                      
      
GROUP BY R.CDSUPERV, R.CDREPRES, R.NMREPRES

ORDER BY R.CDSUPERV, R.NMREPRES
Responder
  • Informação
  • Quem está online

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