Página 1 de 1
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 18:07
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?
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 18:31
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.
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.
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:10
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!
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:24
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.
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:27
por lwinter
Esta logica de C = A - B, vale tambem para qualquer situacao.
Exemplo:
Produtos sem movimentacao.
Clientes sem atendimento no helpdesk
etc...
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:31
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.
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:35
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...
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 21:38
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)
Listar clientes com/sem movimento
Enviado: 06 Jun 2020 23:39
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 ( )