|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Mar 08, 2018 8:13 am Assunto: Duvida MYSQL curva ABC clientes |
|
|
Meu amigos salvadores, estou com mais uma bronca PESADA e preciso que vcs me salvem mais uma vez, o caso é o seguinte:
Preciso montar uma SQL que me mostre a quantidade de pedidos e os valores pagos de todos, ou de alguns, clientes da minha base mês a mês (esses meses podem ser escolhidos), mais ou menos dessa forma:
NOME CLIENTE - QUANT JANEIRO - VALOR JANEIRO - QUANT FEVEREIRO - VALOR FEVEREIRO - QUANT MARÇO - VALOR MARÇO, etc...
para cada cliente eu teria que ter na mesma linha todos os meses selecionados. lembrando que mesmo sem movimentação naquele mês específico o cliente tem que sair mostrando 0
as tabelas que tenho q buscar os dados são:
CLIENTES
COD - NOME
MOVIMENTOS
COD - CODCLI - DATAHORA - VALORPAGO
Agradeço a ajuda de todos. |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Qui Mar 08, 2018 8:59 am Assunto: |
|
|
o select nao vai ter como mostrar nesse formato, pq cada qtde/mes saira em uma linha
pra mostrar os dados nesse formato, o Fastreport possui um recurso de CrossReport. tvz outros gerados possuam alguma opcao _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Qui Mar 08, 2018 9:01 am Assunto: |
|
|
tvz vc consiga isso montando um select cabuloso via programacao, mas o mysql nao tem esse recurso _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Mar 08, 2018 10:03 am Assunto: |
|
|
Muito obrigado meu amigo, vou fazer via programação então...
joemil escreveu: | tvz vc consiga isso montando um select cabuloso via programacao, mas o mysql nao tem esse recurso |
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mar 08, 2018 10:04 am Assunto: |
|
|
Bom dia,
grsoft, não tenho experiência com o MySQL mas experimente fazer uns testes com uma query semelhante a que segue abaixo:
Código: | select
c.Cod,
c.Nome,
count(case when m.DataHora between :DataIni1 and :DataFim1 then 1 end) as Quant1,
sum(case when m.DataHora between :DataIni1 and :DataFim1 then m.ValorPago end) as Valor1,
count(case when m.DataHora between :DataIni2 and :DataFim2 then 1 end) as Quant2,
sum(case when m.DataHora between :DataIni2 and :DataFim2 then m.ValorPago end) as Valor2,
count(case when m.DataHora between :DataIni3 and :DataFim3 then 1 end) as Quant3,
sum(case when m.DataHora between :DataIni3 and :DataFim3 then m.ValorPago end) as Valor3
from Clientes as c
left join Movimentos as m
on m.CodCli = c.CodCli
where
m.DataHora between :DataIniG and :DataFimG |
Os parâmetros DataIni1 e DataFim1 seriam utilizados para obter somente os dados do primeiro mes, e assim seriam com os demais (DataIni2, DataFim2, etc).
Os parâmetros DataIniG e DataFimG seriam utilizados para descartar os meses que não são necessários na query.
Espero que ajude
Editado pela última vez por imex em Ter Out 03, 2023 2:53 pm, num total de 1 vez |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Qui Mar 08, 2018 3:00 pm Assunto: |
|
|
imex escreveu: | Bom dia,
grsoft, não tenho experiência com o MySQL mas experimente fazer uns testes com uma query semelhante a que segue abaixo:
Código: | select
c.Cod,
c.Nome,
count(case when m.DataHora between :DataIni1 and :DataFim1 then 1 end) as Quant1,
sum(case when m.DataHora between :DataIni1 and :DataFim1 then m.ValorPago end) as Valor1,
count(case when m.DataHora between :DataIni2 and :DataFim2 then 1 end) as Quant2,
sum(case when m.DataHora between :DataIni2 and :DataFim2 then m.ValorPago end) as Valor2,
count(case when m.DataHora between :DataIni3 and :DataFim3 then 1 end) as Quant3,
sum(case when m.DataHora between :DataIni3 and :DataFim3 then m.ValorPago end) as Valor3
from Clientes as c
left join Movimentos as m
on m.CodCli = c.CodCli
where
m.DataHora between :DataIniG and :DataFimG |
Os parâmetros DataIni1 e DataFim1 seriam utilizados para obter somente os dados do primeiro mes, e assim seriam com os demais (DataIni2, DataFim2, etc).
Os parâmetros DataIniG e DataFimG seriam utilizados para descartar os meses que não são necessários na query.
Espero que ajude
|
o problema é a qtde de SUMs q tem ser, e se forem 12 meses? por isso disse q da pra fazer um 'select cabuloso' via programacao _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Mar 08, 2018 7:49 pm Assunto: |
|
|
Cara, vc é simplesmente espetacular, incrível...
MUITO obrigado mais uma vez
imex escreveu: | Bom dia,
grsoft, não tenho experiência com o MySQL mas experimente fazer uns testes com uma query semelhante a que segue abaixo:
Código: | select
c.Cod,
c.Nome,
count(case when m.DataHora between :DataIni1 and :DataFim1 then 1 end) as Quant1,
sum(case when m.DataHora between :DataIni1 and :DataFim1 then m.ValorPago end) as Valor1,
count(case when m.DataHora between :DataIni2 and :DataFim2 then 1 end) as Quant2,
sum(case when m.DataHora between :DataIni2 and :DataFim2 then m.ValorPago end) as Valor2,
count(case when m.DataHora between :DataIni3 and :DataFim3 then 1 end) as Quant3,
sum(case when m.DataHora between :DataIni3 and :DataFim3 then m.ValorPago end) as Valor3
from Clientes as c
left join Movimentos as m
on m.CodCli = c.CodCli
where
m.DataHora between :DataIniG and :DataFimG |
Os parâmetros DataIni1 e DataFim1 seriam utilizados para obter somente os dados do primeiro mes, e assim seriam com os demais (DataIni2, DataFim2, etc).
Os parâmetros DataIniG e DataFimG seriam utilizados para descartar os meses que não são necessários na query.
Espero que ajude
|
|
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Mar 08, 2018 8:07 pm Assunto: |
|
|
só precisa de mais 1 detalhe, ele só está aparecendo os clientes q tiveram movimento, não teria como aparecer os que não tiveram? pq eu preciso mostrar no relatório que aquele cliente não teve movimento no mês escolhido. |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Mar 09, 2018 9:43 am Assunto: |
|
|
Experimente deixar o Where da seguinte forma:
Código: | where
m.DataHora between :DataIniG and :DataFimG or
m.DataHora is null |
obs: só para ficar registrado, reparei agora que faltou o Group By na query que postei
Espero que ajude |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Mar 09, 2018 10:01 am Assunto: |
|
|
não deu certo, eu tenho 4500 clientes na base e, sem o m.datahora is null, aparecem 680 (q são os clientes com movimentação), com o m.datahora is null, a SQL demora quase 1 min e só aparecem 866.
imex escreveu: | Experimente deixar o Where da seguinte forma:
Código: | where
m.DataHora between :DataIniG and :DataFimG or
m.DataHora is null |
obs: só para ficar registrado, reparei agora que faltou o Group By na query que postei
Espero que ajude |
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Mar 09, 2018 10:29 am Assunto: |
|
|
Você pode postar a sua query? |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Mar 09, 2018 11:33 am Assunto: |
|
|
select
c.Cod,
c.Nome,
count(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then 1 end) as QuantJaneiro,
sum(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then m.ValorPago end) as ValorJaneiro
from Clientes as c
left join Movimentoam as m
on m.CodCli = c.Cod
where
(m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31') or (m.DATAHORACONCLUSAO is null)
group by c.Cod
imex escreveu: | Você pode postar a sua query? |
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Mar 09, 2018 11:54 am Assunto: |
|
|
Acho que deveria funcionar, mas de qualquer forma experimente fazer uns testes dessa forma:
Código: | select
c.Cod,
c.Nome,
count(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then 1 end) as QuantJaneiro,
sum(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then m.ValorPago end) as ValorJaneiro
from Clientes as c
left join Movimentoam as m
on m.CodCli = c.Cod and
m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31'
group by
c.Cod,
c.Nome |
Espero que ajude |
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Mar 09, 2018 12:15 pm Assunto: |
|
|
Agora foi
Obrigado mais uma vez...
imex escreveu: | Acho que deveria funcionar, mas de qualquer forma experimente fazer uns testes dessa forma:
Código: | select
c.Cod,
c.Nome,
count(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then 1 end) as QuantJaneiro,
sum(case when m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31' then m.ValorPago end) as ValorJaneiro
from Clientes as c
left join Movimentoam as m
on m.CodCli = c.Cod and
m.DATAHORACONCLUSAO between '2018-01-01' and '2018-01-31'
group by
c.Cod,
c.Nome |
Espero que ajude |
|
|
Voltar ao Topo |
|
|
grsoft Aprendiz
Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Mar 09, 2018 3:39 pm Assunto: |
|
|
me tira só uma dúvida, o pq do LEFT JOIN? |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|