Relatorio de Clientes Sem Vendas
21/11/2014
0
Estou refazendo um relatorio de clientes sem vendas aqui para a empresa e gostaria da sugestao de vcs e uma troca de experiencias para montar esse relatorio.
Estou com o esquema de montagem utilizando a clausula NOT EXISTS para montar esse relatorio, gostaria de sugestoes e opinioes do que seria mais performatico, se nao me engano a NOT EXISTS e NOT IN tem o mesmo peso na montagem do script.
A ideia basica da montagem do relatorio fazendo uso de uma destas duas clausulas que mencionei seria pegar os clientes da loja do usuario e linkar com a movimentacao de uma data inicial ate o presente momento e se o cliente nao for encontrado(NOT EXISTS ou NOT IN) ele sera considerado sem venda.
Gostaria de discutir com vcs e assim tomar uma melhor decisao nesta montagem.
Desde ja agradeco a todos.
Abraco.
Alex - Lekao
Alex Lekao
Post mais votado
21/11/2014
Fiquei em dúvida com relação a lógica utilizada na instrução que o Jothaz passou, pois fiz um teste em uma das minhas bases de dados e não funciona.
SELECT C.CODCLI, C.NOME, C.DATACAD FROM CLIENTE C LEFT JOIN VENDA V ON V.CODCLI = C.CODCLI WHERE V.CODCLI IS NULL
Todos os registros que estão armazenados na tabela VENDA possuem um cliente vinculado.
Se restringir o retorno da consulta aplicando "WHERE V.CODCLI IS NULL", nunca vai retornar clientes pois não existe registro que não possua um cliente informado na tabela VENDA.
Marisiana Battistella
Mais Posts
21/11/2014
Soeuseijothaz
CREATE TABLE #EstoqueGeral (linha int) insert into #EstoqueGeral (linha) values (1) insert into #EstoqueGeral (linha) values (2) insert into #EstoqueGeral (linha) values (3) insert into #EstoqueGeral (linha) values (4) insert into #EstoqueGeral (linha) values (5) CREATE TABLE #EstoqueCopia (linha int) insert into #EstoqueCopia (linha) values (1) insert into #EstoqueCopia (linha) values (2) select g.linha from #EstoqueGeral g left outer join #EstoqueCopia on #EstoqueCopia.linha= g.linha where #EstoqueCopia.linha is null drop table #EstoqueGeral drop table #EstoqueCopia
21/11/2014
Alex Lekao
Cara desculpe mas eu nao entendi bem. rsrsr
Mas vou tentar adaptar o seu exemplo no que preciso para ver se atende.
A minha preocupacao das formas que coloquei eh basicamente a performance, elas atendem e trazem o que eu preciso.
Se houver uma forma mais performatica e que de o mesmo resultado gostaria de usar.
A minha intencao eh realmente sugestoes de possibilidades, e com isso a sua sugestao sera avaliada.
Obrigado.
Abraco.
21/11/2014
Alex Lekao
TABELA CLIENTE
CODCLI, NOME, DATACAD
VENDA
CODCLI,NUMERO,DATAVDA
Nao coloquei estrutura, etc, porque sao bem padraozao mesmo e os tipos sao iguais entre as tabelas.
Basicamente no exemplo que vc me deu teria que ficar assim:
SELECT C.CODCLI, C.NOME, C.DATACAD FROM CLIENTE C LEFT JOIN VENDA V ON V.CODCLI = C.CODCLI WHERE V.CODCLI IS NULL
Certo?
21/11/2014
Soeuseijothaz
Para ver qual a melhor performance só com plano de execução.
21/11/2014
Alex Lekao
Mas no caso deste exemplo ele mostra quem nunca teve vendas, certo?
o que preciso eh dos clientes sem vendas em um periodo.
No caso informo uma data inicial ate hoje, quem nao tiver compra dentro deste periodo eh um cliente sem vendas.
mas isto em um conceitual que tenho, gostaria de opnioes tbm, que assim chegaria em algo mais eficiente com relacao ao tratamento da informacao.
21/11/2014
Marisiana Battistella
Um exemplo:
SELECT C.CODCLI, C.NOME, C.DATACAD FROM CLIENTE C WHERE C.CODCLI NOT IN (SELECT V.CODCLI FROM VENDA V WHERE V.DATA BETWEEN '01/10/2014' AND '31/10/2014')
21/11/2014
Alex Lekao
Entao, eu estava querendo uma troca de experiencias na verdade. rsrsr
Mas eu estou chegando a conclusao que tera que ser assim mesmo.
Gostaria de algo mais performatico, por isso pedi sugestoes.
Tudo bem que hoje estou com um retorno nos resultados de alguns segundos, mas se pensar que em alguns anos essa quantidade de registros podera ser bem maior, ele devera aumentar consideravelmente.
Mas muito obrigado por participar.
21/11/2014
Alex Lekao
Esta demorando demais.
Com o not exists nao esta trazendo nada, nao entendi o que estou fazendo de errado, eu nao gosto deste not exists sempre me confundo qdo uso ele. rsrsr
21/11/2014
Alex Lekao
Faltou colocar a referencia dos campos no where da subconsulta(not exists). rsrsr
Sempre esqueco. rsrsr
Deu certo e a performance aumentou, ou seja, o tempo demorou de 1:25 para pouco mais de 5 segundos. rssr
21/11/2014
Marisiana Battistella
21/11/2014
Alex Lekao
ja tinha colocado.
Obrigado.
ate que ficou rapido. rsrsr
27/11/2014
Fabiano Carvalho
Todos os registros que tem na esquerda e não tem na direita caso nao seja colocado o where os registros que não estão na direita será retornado todas as colunas como null.
27/11/2014
Fabiano Carvalho
27/11/2014
Alex Lekao
vou fazer um novo teste, mas ja fiz com o not exists a performance ate que ficou boa, melhor do que eu imaginava.
Obrigado.
Clique aqui para fazer login e interagir na Comunidade :)