Relatorio de Clientes Sem Vendas
Ola Galera, boa tarde!!!
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
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
Curtidas 0
Melhor post
Marisiana Battistella
21/11/2014
Olá! Chegando tarde aqui...
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.
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.
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.
GOSTEI 1
Mais Respostas
Soeuseijothaz
21/11/2014
Acredito que o pessoal aqui do fórum com maior conhecimento podem sugerir uma melhor abordagem, mas veja se este exemplo que pode lhe dar um norte.
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
GOSTEI 0
Alex Lekao
21/11/2014
Oi Jothaz,
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.
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.
GOSTEI 0
Alex Lekao
21/11/2014
Os campos basicos que vou utilizar para montar sao estes:
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:
Certo?
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?
GOSTEI 0
Soeuseijothaz
21/11/2014
Isto!
Para ver qual a melhor performance só com plano de execução.
Para ver qual a melhor performance só com plano de execução.
GOSTEI 0
Alex Lekao
21/11/2014
entendi.
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.
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.
GOSTEI 0
Marisiana Battistella
21/11/2014
Alex, acredito que a melhor maneira de consegui ter o resultado que vc precisa seja utilizando o NOT IN ou NOT EXISTS, como você mesmo comentou.
Um exemplo:
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')
GOSTEI 1
Alex Lekao
21/11/2014
Oi Marisiana,
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.
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.
GOSTEI 0
Alex Lekao
21/11/2014
Usei o not in e demorou 1 min e 25 seg para trazer 20693 registros.
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
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
GOSTEI 0
Alex Lekao
21/11/2014
Descobri o que estava esquecendo.
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
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
GOSTEI 0
Marisiana Battistella
21/11/2014
Acrescenta um GROUP BY V.CODCLI no subselect, pois ele deve retornar mais de uma linha com o mesmo código de cliente.
GOSTEI 0
Alex Lekao
21/11/2014
blz...
ja tinha colocado.
Obrigado.
ate que ficou rapido. rsrsr
ja tinha colocado.
Obrigado.
ate que ficou rapido. rsrsr
GOSTEI 0
Marisiana Battistella
21/11/2014
Por nada Alex!!
GOSTEI 0
Fabiano Carvalho
21/11/2014
a idéia do LEFT JOIN é retornar tudo o que esstá na tabela a esquerda (esquerda do join), incluindo a clasula is null, irá retornar tudo que não tem na tabela da direita.
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.
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.
GOSTEI 0
Fabiano Carvalho
21/11/2014
NOT IN, fode...tente com left join e veja o resultado.
GOSTEI 0
Alex Lekao
21/11/2014
Oi Fabiano,
vou fazer um novo teste, mas ja fiz com o not exists a performance ate que ficou boa, melhor do que eu imaginava.
Obrigado.
vou fazer um novo teste, mas ja fiz com o not exists a performance ate que ficou boa, melhor do que eu imaginava.
Obrigado.
GOSTEI 0
Marisiana Battistella
21/11/2014
NOT IN, fode...tente com left join e veja o resultado.
Poderia me passar um exemplo da instrução com o left join?
GOSTEI 0
Fabiano Carvalho
21/11/2014
Em testes reais(sem plano de execução) existia consultas com NOT IN que custavam demorar em média mais de uma hora, uma mudança rápida demorou menos de 5 minutos, falando-se de 200 mil registros pra mais.
Segue uma imagem que explica o uso do left join.
Fiz no excel pois estou sem SQL instalado.
Primeira consulta
Segunda Consulta.
[img:descricao=Left Join]http://arquivo.devmedia.com.br/forum/imagem/332951-20141127-222225.png[/img]
Segue uma imagem que explica o uso do left join.
Fiz no excel pois estou sem SQL instalado.
Primeira consulta
SELECT * FROM ESQUERDA LEFT JOIN DIREITA ON ID_ESQUERDA = ID_DIREITA
Segunda Consulta.
SELECT * FROM ESQUERDA LEFT JOIN DIREITA ON ID_ESQUERDA = ID_DIREITA WHERE ID_DIREITA IS NULL
[img:descricao=Left Join]http://arquivo.devmedia.com.br/forum/imagem/332951-20141127-222225.png[/img]
GOSTEI 0
Marisiana Battistella
21/11/2014
Fabiano, eu conheço o uso do LEFT JOIN, mesmo assim obrigada por exemplificar.
Pedi um exemplo de solução aplicada à situação apresentada pelo Alex com o uso do LEFT JOIN, pois testei a situação apresentada pelo Jothaz e não obtive os resultados corretos. Então, queria saber como você faria o SELECT para retornar os dados, visto que você comentou que o uso do LEFT JOIN é a melhor solução.
Pedi um exemplo de solução aplicada à situação apresentada pelo Alex com o uso do LEFT JOIN, pois testei a situação apresentada pelo Jothaz e não obtive os resultados corretos. Então, queria saber como você faria o SELECT para retornar os dados, visto que você comentou que o uso do LEFT JOIN é a melhor solução.
GOSTEI 0
Renato Rubinho
21/11/2014
Buenos,
Tenho resultados mais rápidos conforme abaixo:
Abraççç,
rrubinho
Tenho resultados mais rápidos conforme abaixo:
SELECT C.CODCLI, C.NOME, C.DATACAD FROM CLIENTE C LEFT OUTER JOIN VENDA V ON V.CODCLI = C.CODCLI AND V.DATACAD BETWEEN '01/10/2014' AND '31/10/2014' WHERE V.CODCLI IS NULL GROUP BY C.CODCLI, C.NOME, C.DATACAD
Abraççç,
rrubinho
GOSTEI 0
Isaac Jose
21/11/2014
Bom dia a todos,
Lekao.. tenho um relatorio nesse sentido porem nele eu vejo a quantidade de produção por dia de cada loja..
relatorios devem ter a menor quantidade de instruções possiveis por isso aconselho que vc crie uma tabela para o mesmo e a cada atualização drop e crie novamente ou trunc e insert na merma. aconselho que vc demonstre desde quanto a empresa tem o cliente e ao lado a quantidade de compras... ou seja.. lekao é cliente da empresa a 12 meses e fez 4 compras nesse periodo com isso consegue-se focar nos melhores cliente e nos que a empresa necessita dar mais atenção para tentar trazer o cliente de vez para a mesma..
se aplicado de maneira correta e dedicada e se vc conseguir vender o peixe para a pessoa certa "a parte do peixe é a mais importante" você vai obter resultados muito satisfatorios.
att
Isaac
Lekao.. tenho um relatorio nesse sentido porem nele eu vejo a quantidade de produção por dia de cada loja..
relatorios devem ter a menor quantidade de instruções possiveis por isso aconselho que vc crie uma tabela para o mesmo e a cada atualização drop e crie novamente ou trunc e insert na merma. aconselho que vc demonstre desde quanto a empresa tem o cliente e ao lado a quantidade de compras... ou seja.. lekao é cliente da empresa a 12 meses e fez 4 compras nesse periodo com isso consegue-se focar nos melhores cliente e nos que a empresa necessita dar mais atenção para tentar trazer o cliente de vez para a mesma..
se aplicado de maneira correta e dedicada e se vc conseguir vender o peixe para a pessoa certa "a parte do peixe é a mais importante" você vai obter resultados muito satisfatorios.
att
Isaac
GOSTEI 1
Alex Lekao
21/11/2014
Oi Isaac, boa tarde!!!
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
GOSTEI 0
Isaac Jose
21/11/2014
Oi Isaac, boa tarde!!!
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
Opa por nada Lekao. então criei esse relatorio para prospectar novos contras. tive um aumento de 12% no primeiro mes. e esses são os caras que você deve vender o peixe hehe..
em muitos casos as empresas tem uma boa carteira de clientes mais geralmente e mau gerenciada mostrando isso a Diretoria vc pode ter certeza que ela vão aprovar essa linha.
abraços.
GOSTEI 0
Isaac Jose
21/11/2014
Oi Isaac, boa tarde!!!
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
Show cara.
Obrigado, a finalidade que preciso era diferente, mas a sua sugestao caiu como uma luva.
Vou analisar sua sugestao e tentar montar algo em cima disso, acho que a nossa gerencia comercial e diretores irao gostar.
Muito obrigado mais uma vez.
Abraco.
Opa por nada Lekao. então criei esse relatorio para prospectar novos contras. tive um aumento de 12% no primeiro mes. e esses são os caras que você deve vender o peixe hehe..
em muitos casos as empresas tem uma boa carteira de clientes mais geralmente e mau gerenciada mostrando isso a Diretoria vc pode ter certeza que ela vão aprovar essa linha.
abraços.
GOSTEI 0
Marisiana Battistella
21/11/2014
Consegui descobrir o que estava acontecendo...
Como eu trabalho com a modelagem multidimensional de dados, eu precisei envolver 3 tabelas no meu caso de testes, para gerar um exemplo que atendesse a proposta inicial do tópico. Por isso, não funcionava, então fiz um outro teste envolvendo apenas duas tabelas e funcionou.
Desculpem meus questionamentos, mas eu realmente tinha ficado em dúvida quando apliquei o exemplo e não tive sucesso.
Para a minha estrutura de banco a melhor alternativa continua sendo o NOT IN e a performance é muito boa apesar de analisar uma grande quantidade de dados.
Obrigada a todos!
Como eu trabalho com a modelagem multidimensional de dados, eu precisei envolver 3 tabelas no meu caso de testes, para gerar um exemplo que atendesse a proposta inicial do tópico. Por isso, não funcionava, então fiz um outro teste envolvendo apenas duas tabelas e funcionou.
Desculpem meus questionamentos, mas eu realmente tinha ficado em dúvida quando apliquei o exemplo e não tive sucesso.
Para a minha estrutura de banco a melhor alternativa continua sendo o NOT IN e a performance é muito boa apesar de analisar uma grande quantidade de dados.
Obrigada a todos!
GOSTEI 0
Alex Lekao
21/11/2014
Ola pessoal, bom dia!!!
Isaac, obrigado pela sugestao, temos gerentes comerciais que fazem esse intermeio juntamente com promotores de vendas.
Normalmente sao eles que fazem uso destes relatorios e fazem esse trabalho de prospeccao e reconquista de clientes e via de regra eles solicitam relatorios para eu desenvolver dentro de suas necessidades, a sua sugestao sera vista por mim e devera ser implementada como uma opcao a mais de trabalho para eles, os caras sempre gostam de novos relatorios de analises, tem um que eh quase fanatico, o cara eh extrememente analitoc. rsrsr
mais uma vez obrigado.
Marisiana,
Muito obrigado por contribuir com a minha solicitacao, suas sugestoes e analises sao sempre muito bem vindas.
Obrigado.
Isaac, obrigado pela sugestao, temos gerentes comerciais que fazem esse intermeio juntamente com promotores de vendas.
Normalmente sao eles que fazem uso destes relatorios e fazem esse trabalho de prospeccao e reconquista de clientes e via de regra eles solicitam relatorios para eu desenvolver dentro de suas necessidades, a sua sugestao sera vista por mim e devera ser implementada como uma opcao a mais de trabalho para eles, os caras sempre gostam de novos relatorios de analises, tem um que eh quase fanatico, o cara eh extrememente analitoc. rsrsr
mais uma vez obrigado.
Opa por nada Lekao. então criei esse relatorio para prospectar novos contras. tive um aumento de 12% no primeiro mes. e esses são os caras que você deve vender o peixe hehe..
em muitos casos as empresas tem uma boa carteira de clientes mais geralmente e mau gerenciada mostrando isso a Diretoria vc pode ter certeza que ela vão aprovar essa linha.
abraços.
em muitos casos as empresas tem uma boa carteira de clientes mais geralmente e mau gerenciada mostrando isso a Diretoria vc pode ter certeza que ela vão aprovar essa linha.
abraços.
Marisiana,
Muito obrigado por contribuir com a minha solicitacao, suas sugestoes e analises sao sempre muito bem vindas.
Obrigado.
Consegui descobrir o que estava acontecendo...
Como eu trabalho com a modelagem multidimensional de dados, eu precisei envolver 3 tabelas no meu caso de testes, para gerar um exemplo que atendesse a proposta inicial do tópico. Por isso, não funcionava, então fiz um outro teste envolvendo apenas duas tabelas e funcionou.
Desculpem meus questionamentos, mas eu realmente tinha ficado em dúvida quando apliquei o exemplo e não tive sucesso.
Para a minha estrutura de banco a melhor alternativa continua sendo o NOT IN e a performance é muito boa apesar de analisar uma grande quantidade de dados.
Obrigada a todos!
Como eu trabalho com a modelagem multidimensional de dados, eu precisei envolver 3 tabelas no meu caso de testes, para gerar um exemplo que atendesse a proposta inicial do tópico. Por isso, não funcionava, então fiz um outro teste envolvendo apenas duas tabelas e funcionou.
Desculpem meus questionamentos, mas eu realmente tinha ficado em dúvida quando apliquei o exemplo e não tive sucesso.
Para a minha estrutura de banco a melhor alternativa continua sendo o NOT IN e a performance é muito boa apesar de analisar uma grande quantidade de dados.
Obrigada a todos!
GOSTEI 0
Marisiana Battistella
21/11/2014
Por nada Alex!
Também agradeço a vc e ao pessoal q sempre compartilha seus conhecimentos e suas experiências.!
Também agradeço a vc e ao pessoal q sempre compartilha seus conhecimentos e suas experiências.!
GOSTEI 1