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 

Dúvida SQL (somas)

 
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 Jan 30, 2020 11:43 am    Assunto: Dúvida SQL (somas) Responder com Citação

Bom dia pessoal, estou com uma dúvida de como construir uma SQL (banco MySQL) para o resultado de uma soma que é a seguinte:

tenho 3 tabelas que são as seguintes:

movimento
COD, DATAHORA

detmovimento
COD, CODPROD, QUANT, VALOR

detcomplemento
COD, CODDETMOVIMENTO, QUANT, VALOR

eu gostaria de uma sql q me retornasse a soma de todos os produtos vendidos (quantidade e valor) num período de data, até ai tudo bem, o problema é q quando tem 2(dois) produtos na tabela detcomplemento atrelados ao produto do detmovimento, ele acaba somando o produto do detmovimento 2(duas) vezes, esse é o meu problema...
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 Jan 30, 2020 8:48 pm    Assunto: Responder com Citação

Boa noite,

Não sei se vou conseguir ajuda-lo, mas você pode postar um exemplo com uma amostra de dados das tabelas e o respectivo resultado esperado?
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 Jan 30, 2020 9:57 pm    Assunto: Responder com Citação

imex escreveu:
Boa noite,

Não sei se vou conseguir ajuda-lo, mas você pode postar um exemplo com uma amostra de dados das tabelas e o respectivo resultado esperado?


Com certeza.. Abaixo vãos dois exemplos

movimento
COD,DATAHORA
1,30/01/2020 10:00

detmovimento
COD,CODMOV,CODPROD,QUANT,VALOR
1,1,1,1,10

detcomplemento
COD,CODDETMOV,CODPROD,QUANT,VALOR
1,1,2,1,5


a sql que eu uso é a seguinte:

select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(detcomplemento.VALOR) as VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD=detmovimento.CODMOV)
left join detcomplemento on (detmovimento.COD=detcomplemento.CODDETMOV)
group by movimento.COD

para essa primeira soma, os totais seriam:
VALORTOTALPROD=10
VALORTOTALCOMPL =5

mas se eu tiver dois complementos, ele duplica o valor dos produtos:

movimento
COD,DATAHORA
1,30/01/2020 10:00

detmovimento
COD,CODMOV,CODPROD,QUANT,VALOR
1,1,1,1,10

detcomplemento
COD,CODDETMOV,CODPROD,QUANT,VALOR
1,1,2,1,5
1,1,3,1,6

com a mesma SQL o valor ficaria:
VALORTOTALPROD=20
VALORTOTALCOMPL =11

quando na verdade deveria ficar assim:
VALORTOTALPROD=10
VALORTOTALCOMPL =11
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 Jan 31, 2020 10:28 am    Assunto: Responder com Citação

Qual versão do MySQL você está utilizando?
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 Jan 31, 2020 10:51 am    Assunto: Responder com Citação

imex escreveu:
Qual versão do MySQL você está utilizando?


5.7.10
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 Jan 31, 2020 11:45 am    Assunto: Responder com Citação

Considerando que a sua query é um pouco mais complexa do que essa que você postou, segue uma sugestão para testes:

Código:
select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
left join
(
    select CODDETMOV, sum(VALOR) as VALOR
    from detcomplemento
    group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
group by movimento.COD


Espero que ajude


Editado pela última vez por imex em Dom Out 01, 2023 5:43 pm, num total de 2 vezes
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 Jan 31, 2020 12:51 pm    Assunto: Responder com Citação

imex escreveu:
Considerando que a sua query é um pouco mais complexa do que essa que você postou, segue uma sugestão para testes:

Código:
select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
left join
(
    select CODDETMOV, sum(VALOR) as VALOR
    from detcomplemento
    group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
group by movimento.COD


Espero que ajude


Muito obrigado meu amigo, vc sempre me salvando....
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: Qua Fev 05, 2020 8:29 am    Assunto: Responder com Citação

meu amigo, eu tenho mais uma dúvida, nessa minha SQL eu também tenho um GROUP por categorias, que no caso ficaria assim:

select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, categoria.NOME
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
inner join produtos on (detmovimento.CODPRO = produtos.COD)
inner join categorias on (produtos.CODCATEG = categorias.COD)
left join
(
select CODDETMOV, sum(VALOR) as VALOR
from detcomplemento
group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
group by categoria.NOME

até ai tudo bem, ele vai fazer a soma cartegoria por categoria, só que eu preciso também da soma GERAL para que eu consigo calcular qual a porcentagem que cada categoria representa, consegue me ajudar nisso?
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: Qua Fev 05, 2020 10:52 am    Assunto: Responder com Citação

Não tenho nenhuma experiência com o MySQL mas com essa versão que você está me parece que é necessário somar tudo de novo para obter o total geral:

Código:
select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, categoria.NOME,
    geral.VALORTOTALPROD, geral.VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
inner join produtos on (detmovimento.CODPRO = produtos.COD)
inner join categorias on (produtos.CODCATEG = categorias.COD)
left join
(
    select CODDETMOV, sum(VALOR) as VALOR
    from detcomplemento
    group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
cross join
(
    select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL
    from movimento
    inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
    left join
    (
        select CODDETMOV, sum(VALOR) as VALOR
        from detcomplemento
        group by CODDETMOV
    ) as compl on (detmovimento.COD = compl.CODDETMOV)
) as geral
group by categoria.NOME


Dependendo do caso pode ser que seja melhor fazer a soma para obter o total geral na aplicação a partir do resultado retornado pela query inicial.

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: Qua Fev 05, 2020 11:30 am    Assunto: Responder com Citação

Realmente se tiver q fazer outra soma é preferível somar dentro da aplicação mesmo. Te agradeço meu amigo por toda a ajuda..

imex escreveu:
Não tenho nenhuma experiência com o MySQL mas com essa versão que você está me parece que é necessário somar tudo de novo para obter o total geral:

Código:
select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, categoria.NOME,
    geral.VALORTOTALPROD, geral.VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
inner join produtos on (detmovimento.CODPRO = produtos.COD)
inner join categorias on (produtos.CODCATEG = categorias.COD)
left join
(
    select CODDETMOV, sum(VALOR) as VALOR
    from detcomplemento
    group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
cross join
(
    select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL
    from movimento
    inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
    left join
    (
        select CODDETMOV, sum(VALOR) as VALOR
        from detcomplemento
        group by CODDETMOV
    ) as compl on (detmovimento.COD = compl.CODDETMOV)
) as geral
group by categoria.NOME


Dependendo do caso pode ser que seja melhor fazer a soma para obter o total geral na aplicação a partir do resultado retornado pela query inicial.

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: Qua Fev 05, 2020 11:38 am    Assunto: Responder com Citação

uma última ajuda, prometo kkkkkkk

caso eu tenha também um GROUP BY USUARIO, como eu faria para saber o valor total por cada usuário?

select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, categoria.NOME, usuario.LOGIN
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
inner join produtos on (detmovimento.CODPRO = produtos.COD)
inner join categorias on (produtos.CODCATEG = categorias.COD)
inner join usuario on (movimento.CODUSU = usuario.COD)
left join
(
select CODDETMOV, sum(VALOR) as VALOR
from detcomplemento
group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
cross join
(
select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL
from movimento
inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
left join
(
select CODDETMOV, sum(VALOR) as VALOR
from detcomplemento
group by CODDETMOV
) as compl on (detmovimento.COD = compl.CODDETMOV)
) as geral
group by usuario.LOGIN, categoria.NOME
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: Qua Fev 05, 2020 11:50 am    Assunto: Responder com Citação

Como você quer o total por usuário? O que você vai fazer com esse total?
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: Qua Fev 05, 2020 5:45 pm    Assunto: Responder com Citação

imex escreveu:
Como você quer o total por usuário? O que você vai fazer com esse total?


eu preciso saber a porcentagem por cada categoria então para isso eu preciso saber o total geral e o total por categoria...
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 Fev 06, 2020 9:36 am    Assunto: Responder com Citação

Experimente acrescentar o trecho abaixo para obter o total por categoria:

Código:
inner join
(
    select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, produtos.CODCATEG
    from movimento
    inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
    inner join produtos on (detmovimento.CODPRO = produtos.COD)
    left join
    (
        select CODDETMOV, sum(VALOR) as VALOR
        from detcomplemento
        group by CODDETMOV
    ) as compl on (detmovimento.COD = compl.CODDETMOV)
    group by produtos.CODCATEG
) as categ on produtos.CODCATEG = categ.CODCATEG


obs: se você quer somente a soma do valor da tabela detcomplemento acho que é melhor utilizar uma subquery no lugar daquele left join, que foi sugerido considerando que seriam retornados outras somas alem do valor

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 Fev 06, 2020 10:17 am    Assunto: Responder com Citação

Deu certo meu amigo, mais uma vez, MUITO obrigado mesmo, de verdade...

imex escreveu:
Experimente acrescentar o trecho abaixo para obter o total por categoria:

Código:
inner join
(
    select sum(detmovimento.VALOR) as VALORTOTALPROD, sum(compl.VALOR) as VALORTOTALCOMPL, produtos.CODCATEG
    from movimento
    inner join detmovimento on (movimento.COD = detmovimento.CODMOV)
    inner join produtos on (detmovimento.CODPRO = produtos.COD)
    left join
    (
        select CODDETMOV, sum(VALOR) as VALOR
        from detcomplemento
        group by CODDETMOV
    ) as compl on (detmovimento.COD = compl.CODDETMOV)
    group by produtos.CODCATEG
) as categ on produtos.CODCATEG = categ.CODCATEG


obs: se você quer somente a soma do valor da tabela detcomplemento acho que é melhor utilizar uma subquery no lugar daquele left join, que foi sugerido considerando que seriam retornados outras somas alem do valor

Espero que ajude
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
Página 1 de 1

 
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