Selecionar Cliente sem Compra nenhuma de determinado vendedor

SQL

Oracle

05/09/2018

Bom dia! estou tentando efetuar um select que me resulte nos clientes que não efetivaram nenhuma compra no meu sistema de um vendedor específico.
Fiz toda a verificação dos clientes dos meus vendedores e o select realmente está trazendo todos os clientes vinculados de cada vendedor, mas quando vou utilizar uma verificação no where para retornar somente os clientes que não tiveram venda ele não apresenta o resultado correto.
Estou utilizando o seguinte código:
SELECT
        CODCLIENTETABELA2,
        RAZAOSOCIALCLIENTE,
        CODVENDEDORTABELA2,
        NOMEVENDEDOR
       
FROM CLIENTETABELA2,
     VENDEDOR,
     PARCEIRO,
     VENDAS
            
WHERE CODVENDEDORTABELA2 =  CODVENDEDORTABELA1
      AND CODCLIENTETABELA2 = CODCLIENTETABELA1
      AND CODVENDEDORTABELA2 = ''''X''''
      
          
UNION

SELECT
        CODIGOCLIENTETABELA1,
        RAZAOSOCIALCLIENTE,
        NOMECLIENTETABELA1,
        CODVENDEDORTABELA1,
        NOMEVENDEDOR
     
FROM CLIENTE,
     VENDEDOR,
     CLIENTETABELA2,
     VENDAS

      WHERE CLIENTE.CODVENDEDORTABELA1 = VENDEDOR.CODVENDEDORTABELA1
      AND CLIENTE.CODCLIENTETABELA1 NOT IN VENDAS.CODCLIENTETABELA1
      AND VEN.CODVEND = ''''X''''

Se alguém puder me dar uma luz do que estou fazendo de errado agradeço muito. Obrigado desde já.
Maicon Scapatici

Maicon Scapatici

Curtidas 0

Melhor post

Alex Lekao

Alex Lekao

05/09/2018

Ola Maicon, boa tarde!!!

Não conheço muito bem a mecânica do Oracle, mas vc vai utilizar mesmo com union?

Eu sugeriria um subselect para fazer o que vc precisa.

Por exemplo:

select
   codcliente,
   nome,
from clientes
where codcliente not in (select
                                               codcliente
                                            from vendas
                                            where datavenda between '01.08.2018' and '31.08.2018'
                                            group by codcliente)


Sem muita analise, montei isso para vc ter uma ideia de como poderia ser feito.

Normalmente eu faco de modo diferente aqui, mas as minhas estruturas e tabelas sao diferentes, e utilizo o SQL Server.

Espero que tenha ajudado.
GOSTEI 3

Mais Respostas

Maicon Scapatici

Maicon Scapatici

05/09/2018

Cara, você não tem noção do quando me ajudou, ficou perfeito, era exatamente isso que estava faltando, sem esse select no where acredito que ele estava tentando comparar com dados não existentes por isso não filtrava, ai instanciando este select no where ele comparou com o resultado que existe... Muito obrigado de verdade!
GOSTEI 0
Alex Lekao

Alex Lekao

05/09/2018

Oi Maicon, bom dia!!!

Fico feliz em poder ajudar.

Mas acredito que possa melhorar ainda mais esse script, como disse não conheço bem a mecânica do Oracle, na vdd não conheço nada. rsrsrs

Mas esse select que te sugeri ele não é performático, trabalho com sql server e nele not in não eh uma boa opção por causa da performance, e uma opção seria o outer apply, não sei se isso eh possível com Oracle.

Ou até mesmo usando Join, mas entre join e outer o outer eh mais performático em alguns casos, mas precisa analisar performance e tudo o mais.

Caso precise, podemos tentar melhorar esse script para te dar a melhor performance.

Atenciosamente,
GOSTEI 2
Maicon Scapatici

Maicon Scapatici

05/09/2018

Fico grato e aceito para qualquer momento melhorarmos o desempenho do script. Obrigado novamente.
GOSTEI 0
Lucas Brum

Lucas Brum

05/09/2018

Muito obrigado Alex Lekao!
Cara, depois de vagar por dias tentando resolver um problema em uma consulta, graças a vocês consegui chegar no resultado que eu queria!

Sou iniciante na área, então toda e qualquer informação é bem vinda hehehe...

Precisava trazer somente clientes que não tinham contratos ativos em uma consulta, só que a coluna DS_SITUACAOCONTRATO tem um valor para cada contrato do cliente(Ativo, liquidado, cancelado). Então se eu tentasse usar somente o filtro DS_SITUACAOCONTRATO = ''LIQUIDADO'' na minha tabela CONTRATOSPRODUCAO me trazia clientes que tinham contratos liquidados, mas acabava trazendo os ativos tbm...
Daí tentei ver em vários fóruns e não conseguia resolver... Hoje deu certo!

Com base no que você respondeu, utilizei a mesma lógica, ficando assim o filtro:

Usei no WHERE NR_CPF_CNPJ NOT IN (Select NR_CPF_CNPJ
From vwContratosProducao
Where DS_SITUACAOCONTRATO = ''Ativo''
GROUP BY NR_CPF_CNPJ)

Valeuuu!
GOSTEI 0
Heraldo Araujo

Heraldo Araujo

05/09/2018

O problema é basicamente simples, porém torna-se muito difícil, pois é qse impossível um observador externo resolver uma query sem saber quais as chaves primárias e os relacionamentos entre as tabelas de um sistema. Nem precisa se de todas as tabelas, basta apenas as envolvidas no caso.
GOSTEI 0
POSTAR