Listar clientes com/sem movimento

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar clientes com/sem movimento

Mensagem por JoséQuintas »

Tenho uma opção no cadastro de clientes de listar com/sem movimento.

Estou na dúvida sobre como fazer isso.

Por enquanto pensei em duas alternativas:

SELECT ..., count( movimento.* ) // algo desse tipo

ou

SELECT .... WHERE CODIGO IN ( SELECT DISTINCT CODIGO FROM MOVIMENTO )

Alguma opção melhor?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar clientes com/sem movimento

Mensagem por JoséQuintas »

Este funcionou

SELECT * FROM jpcadastro WHERE idcadastro IN ( SELECT DISTINCT nfcadastro FROM jpnotfis )

segundo o HeidiSQL, levou 0.016 segundos de servidor e 0.281 segundos de rede

já este, só por curiosidade

SELECT idcadastro FROM jpcadastro WHERE idcadastro IN ( SELECT DISTINCT nfcadastro FROM jpnotfis )

levou 0.156 segundos de servidor e 0.031 segundos de rede

fiz só por cusiosidade, pra ver o tempo de rede.
Não lembro de ter visto essa informação de rede antes.

Aproveitando..... fiz outro teste:
São 5.006 clientes.
Pra trazer TUDO de uma vez, 0.250 segundos em rede 100MB, 1/4 de segundo.
mysql.png
Um browse dos clientes tem menos informação que isso, portanto é mais rápido.
Ou seja, praticamente instantâneo mostrar todos os clientes na tela, e ficar passeando por todos eles.
1/4 de segundo e ficam servidor e rede livres.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Oi Jose!
O sql trabalha com a teoria dos conjuntos. Voce pode fazer calculos matematicos com os conjuntos gerados.
Ex:
Considere uma query A como sendo os clientes cadastrados.
Considere uma query B como sendo os clientes movimentados em um periodo especifico.
Logo os clientes sem movimento sera:
C = A - B
Pronto, simples assim!
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Sei que voces sao devs tarimbados, mas nao custa colocar aqui um ponto que pode ser proveitoso a alguns do forum.
Esqueci de dizer que a query dos clientes cadastrados precisa prever a data de inclusao do cliente, pois caso se deseje saber os clientes que nao movimentaram em um determinado mes de 01/mm a 30/mm nao podemos considerar os clientes cadastrados apos 30/mm, senao vai aparecer no resultado clientes que ainda nao faziam parte da empresa naquele periodo. Idem para clientes inativados. Eles podem estar inativados hoje mas na epoca ele estava inativo? Se voce guardar uma data da exlcusao da para prever isso na query de clientes cadastrados. Desta forma, a informacao fica mais confiavel.
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Esta logica de C = A - B, vale tambem para qualquer situacao.
Exemplo:
Produtos sem movimentacao.
Clientes sem atendimento no helpdesk
etc...
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Zé vi que voce esta usando a clausula distinct.
Uma vez, fiz um evento em nossa empresa para o time de devs e contratamos uma consultoria de tunning.
Eles disseram que o distinct cai a perfomance e deve ser utilizado apenas se nao tiver outra alternativa.
Mas faca o teste se nao ficar muito lento tudo bem.
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Relembrando eu nao botava a mao na massa mais. Eu era apenas uma papagiao de pirata que ficava falando o que deveria ser feito e porque.
Estou tentando reaprender tudo de novo e colocar a mao na massa. Como estou com tempo, este esta sendo mey hobby.
Por isso que estou enferrujado na pratica...kkkkk......
O meu time sabia muito de Sql mas eu necas de nada...tinha conhecimento do basico...
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Listar clientes com/sem movimento

Mensagem por lwinter »

Dica: Quando fizer subtracao de conjuntos. Coloque sempre o conjunto maior primeiro senao retorna errado/vazio.
Ex:
C = A - B
clientes cadastrados A é um conjunto maior que os clientes movimentados B.
C = B - A (acredito que nao ira funcionar)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar clientes com/sem movimento

Mensagem por JoséQuintas »

lwinter escreveu:Dica: Quando fizer subtracao de conjuntos. Coloque sempre o conjunto maior primeiro senao retorna errado/vazio.
Ex:C = A - B
clientes cadastrados A é um conjunto maior que os clientes movimentados B.
C = B - A (acredito que nao ira funcionar)
Usei a opção de DISTINCT nos dois casos.

WHERE [NOT] IDCODIGO IN ( )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder