Selecionar Cliente sem Compra nenhuma de determinado vendedor
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:
Se alguém puder me dar uma luz do que estou fazendo de errado agradeço muito. Obrigado desde já.
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
Curtidas 0
Melhor post
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:
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.
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
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
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,
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
05/09/2018
Fico grato e aceito para qualquer momento melhorarmos o desempenho do script. Obrigado novamente.
GOSTEI 0
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!
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
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