 |
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 Jan 30, 2020 11:43 am Assunto: Dúvida SQL (somas) |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jan 30, 2020 8:48 pm Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Jan 30, 2020 9:57 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 31, 2020 10:28 am Assunto: |
|
|
Qual versão do MySQL você está utilizando? |
|
Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Jan 31, 2020 10:51 am Assunto: |
|
|
imex escreveu: | Qual versão do MySQL você está utilizando? |
5.7.10 |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 31, 2020 11:45 am Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Sex Jan 31, 2020 12:51 pm Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Fev 05, 2020 8:29 am Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 05, 2020 10:52 am Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Fev 05, 2020 11:30 am Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Fev 05, 2020 11:38 am Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 05, 2020 11:50 am Assunto: |
|
|
Como você quer o total por usuário? O que você vai fazer com esse total? |
|
Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qua Fev 05, 2020 5:45 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Fev 06, 2020 9:36 am Assunto: |
|
|
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 |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Fev 06, 2020 10:17 am Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|