ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Duvida MYSQL curva ABC clientes
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Mar 08, 2018 8:13 am    Assunto: Duvida MYSQL curva ABC clientes Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Qui Mar 08, 2018 8:59 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Qui Mar 08, 2018 9:01 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Mar 08, 2018 10:03 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mar 08, 2018 10:04 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Qui Mar 08, 2018 3:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Mar 08, 2018 7:49 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Qui Mar 08, 2018 8:07 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Mar 09, 2018 9:43 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Sex Mar 09, 2018 10:01 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Mar 09, 2018 10:29 am    Assunto: Responder com Citação

Você pode postar a sua query?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Sex Mar 09, 2018 11:33 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Mar 09, 2018 11:54 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Sex Mar 09, 2018 12:15 pm    Assunto: Responder com Citação

Agora foi Smile

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
Ver o perfil de Usuários Enviar Mensagem Particular
grsoft
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 10 de Abril de 2006
Mensagens: 107

MensagemEnviada: Sex Mar 09, 2018 3:39 pm    Assunto: Responder com Citação

me tira só uma dúvida, o pq do LEFT JOIN?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB