Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Somar e Subtrair


Question

Ola pessoal. Tenho 2 tabelas, preciso fazer um SUM e subtrair uma da outra, mas não consigo. Estou fazendo assim:

SELECT SUM(Quantidade) FROM TabelaBaixa
GROUP BY CodigoProduto
SELECT SUM(Quantidade) FROM TabelaDevolucao
GROUP BY CodigoProduto

Agora preciso pegar o resultado da primeira e subtrair pela segunda. Como faço? Tentei fazer tudo isso em apenas um select, mas ele duplicou o resultado quanto tentei.

Exemplo de dados inseridos na tabela

Tabela Baixa

Cod Produto Quantidade

1 Agua 4

2 Refrigerante 3

3 Refrigerante 2

Tabela Devolução

Cod Produto Quantidade

1 Agua 1

2 Refrigerante 2

Preciso do seguinte resultado

Agua = Quantidade Tabela Baixa - Quantidade Tabela Devolução = (4) - (1) = 3 (mostrar esse valor no SQL).

Refri = Quantidade Tabela Baixa - Quantidade Tabela Devolução = (3+2) - (2) = 3 (mostrar esse valor no SQL).

Se puder ajudar agradeço. Obrigado

Edited by Denis Courcy
Melhorar entendimento do código
Link to post
Share on other sites

12 answers to this question

Recommended Posts

  • 0

Eu fiz assim:

mysql> select produto, sum(baixa.qtde)as baixa, sum(devolucao.qtd)as devolucao 
from baixa 
left join devolucao on baixa.produto = devolucao.prod 
group by produto;

+---------+-------+-----------+

| produto | baixa | devolucao |

+---------+-------+-----------+

| agua | 4 | 1 |

| refri | 5 | 2 |

+---------+-------+-----------+

$diferenca=$baixa-$devolucao;

Edited by Denis Courcy
Melhorar entendimento do código
Link to post
Share on other sites
  • 0

É quase isso, 'Tchello' . Você pode fazer tudo via sql assim:

mysql> select produto, sum(baixa.qtde)as baixa, sum(devolucao.qtd)as devolucao,  sum(baixa.qtde)-sum(devolucao.qtd) as diferenca
from baixa 
left join devolucao on baixa.produto = devolucao.prod 
group by produto;

Link to post
Share on other sites
  • 0

Ola Denis Courcy e Tchello. Não deu certo. Ele executa o script, mas os valores aparecem erado. Aparece assim:

(os dados inseridos na minha tabela estão diferentes do exemplo que postei, então não comprarem o valor. É apenas exemplo do erro)

Produto Baixa Devolução

1 28 38

2 28 38

Percebem que ele mostra os códigos certos, um em cada linha, mas os resultados são iguai nas duas linhas e colunas, e são números que não tem nada a ver com os inseridos.

Vou colocar os campos da minha tabela pra voces me ajudarem

Produto

CodProduto

NomeProduto

Baixa

CodBaixa

CodProduto (FK)

QuantBaixa

Devolução

CodBaixa

CodProduto (FK)

QuantBaixa

DADOS INSERIDOS

Tabela Produto

Cod Nome

1 Agua

2 Refrigerante

3 Cerveja

Tabela Baixa

Cod Cod Produto Quantidade

1 1 (Agua) 4

2 2 (Refrigerante) 3

3 2 (Refrigerante) 2

Tabela Devolução

Cod Cod Produto Quantidade

1 1 (Agua) 1

2 2 (Refrigerante) 2

Link to post
Share on other sites
  • 0

Oi, 'Braulio Ribeiro'

Criei a seguinte estrutura de testes:

create database braulio;
use braulio;
create table Produto(
CodProduto int,
NomeProduto varchar(20),
primary key (CodProduto))engine = myisam;
insert into Produto(CodProduto, NomeProduto)
values(1, 'Agua'),(2, 'Refrigerante'), (3, 'Cerveja');

create table Baixa(
CodBaixa int,
CodProduto int,
Quant int,
primary key(CodBaixa),
key (CodProduto))engine= myisam;
insert into Baixa(CodBaixa, CodProduto, Quant)
Values (1,1,4), (2, 2, 3), (3, 2, 2); 

create table Devolucao(
CodDevolucao int,
CodProduto int,
Quant int,
primary key(CodDevolucao),
key (CodProduto))engine= myisam;
insert into Devolucao(CodDevolucao, CodProduto, Quant)
Values (1,1,2), (2, 2, 2);
Fiz a query
select straight_join  p.NomeProduto, sum(b.Quant) as baixa, sum(d.Quant) as devolucao, 
(sum(b.Quant) - sum(d.Quant)) as diferenca
from produto p
left join baixa b on b.CodProduto = p.CodProduto
left join devolucao d on d.CodProduto = p.CodProduto
group by p.NomeProduto
E obtive o resultado:
NomeProduto    baixa    devolucao    diferenca
Agua               4            2            2
Cerveja         Null         Null         Null
Refrigerante       5            4            1

Link to post
Share on other sites
  • 0

Boa tarde Denis Courcy. Acabei de testar a SQL, eu estava viajando e não deu pra testar antes.

Funcionou somente com 1 cadastro em Baixas e em Devolucao, com mais de um ele faz a soma de forma errada.

Tive que tirar a expressão straight_join para funcionar.

Ai com você funcinou com mais de 1 cadsatro?

Denis Courcy, acabei de perceber que cadastrei o tópico na sessão errada. Eu uso SQL Server 2008.

Será que é por isso que não aceitou o comando straight_join?

Link to post
Share on other sites
  • 0

Para facilitar, estou postando meu SQL.

SELECT MP.idMateriaPrima, MP.descricaoMateriaPrima,
BB.quantBaixa AS Baixa, BD.quantBaixa AS Baixa_Devolução, TB.quantBaixa AS Transferência_Baixa, TD.quantBaixa AS Transferência_Devolução,
((SUM(BB.quantBaixa) - SUM(BD.quantBaixa)) + (SUM(TB.quantBaixa) - SUM(TD.quantBaixa))) AS Total
FROM MateriaPrima MP
LEFT JOIN BaixaProdutoAlmoxarifadoItem BB ON BB.idMateriaPrima = MP.idMateriaPrima
LEFT JOIN BaixaProdutoAlmoxarifadoDev BD ON BD.idMateriaPrima = MP.idMateriaPrima
LEFT JOIN TransfMatDespesaItem TB ON TB.idMateriaPrima = MP.idMateriaPrima
LEFT JOIN TransfMatDespesaDevolucao TD ON TD.idMateriaPrima = MP.idMateriaPrima
GROUP BY MP.descricaoMateriaPrima, MP.idMateriaPrima, BB.quantBaixa, BD.quantBaixa, TB.quantBaixa, TD.quantBaixa

Com esse SQL, está aparecendo os seguintes resultados:

sb15346201.jpg

Teria que aparecer assim:

sb15346202.jpg

Os dados inseridos no meu banco são:

Tabela Saida_Baixa

sb15346203.jpg

Tabela Saida_Devolução

sb15346204.jpg

Tabela Transferência_Baixa

sb15346205.jpg

Tabela Transferência_Devolução

sb15346206.jpg

Se puderem ajudar, agradeço.

Braulio

Edited by Braulio Ribeiro
Link to post
Share on other sites
  • 0

Bom dia Bráulio,

Estava lento os posts e peguei como base o ultimo post mesmo... :.)

Criei umas tabelas temporárias e fiz a somatória. Dê uma olhada se é isto mesmo.

OBS.:

1 - O calculo do TOTAL de Prego que postou está ok: (25-2)+(4-9) = 18

Mas o calculo do Martelo não está: (20-4)+(12-8) = 20 --> na sua tabela está 12

2 - Os subselects se repetem pois não é possível utilizar os ALIAS para realizar cálculos no mesmo select.

Script:

create table #MateriaPrima (idMateriaPrima int, DescricaoMateriaPrima varchar(20))
insert into #MateriaPrima values (3, 'PREGO')
insert into #MateriaPrima values (4, 'MARTELO')

create table #Saida_Baixa (idMateriaPrima int, DescricaoMateriaPrima varchar(20), QuantBaixa int)
insert into #Saida_Baixa values (4, 'MARTELO', 10)
insert into #Saida_Baixa values (3, 'PREGO', 5)
insert into #Saida_Baixa values (4, 'MARTELO', 10)
insert into #Saida_Baixa values (3, 'PREGO', 10)
insert into #Saida_Baixa values (3, 'PREGO', 10)


create table #Saida_Devolucao (idMateriaPrima int, DescricaoMateriaPrima varchar(20), QuantBaixa int)
insert into #Saida_Devolucao values (3, 'PREGO', 2)
insert into #Saida_Devolucao values (4, 'MARTELO', 4)

create table #Transferencia_Baixa (idMateriaPrima int, DescricaoMateriaPrima varchar(20), QuantBaixa int)
insert into #Transferencia_Baixa values (4, 'MARTELO', 12)
insert into #Transferencia_Baixa values (3, 'PREGO', 3)
insert into #Transferencia_Baixa values (3, 'PREGO', 1)

create table #Transferencia_Devolucao (idMateriaPrima int, DescricaoMateriaPrima varchar(20), QuantBaixa int)
insert into #Transferencia_Devolucao values (3, 'PREGO', 9)
insert into #Transferencia_Devolucao values (4, 'MARTELO', 8)


select MP.idMateriaPrima, MP.descricaoMateriaPrima, 
(select sum(SB.QuantBaixa) from #Saida_Baixa SB where SB.idMateriaPrima=MP.idMateriaPrima) as Saida_Baixa,
(select sum(SD.QuantBaixa) from #Saida_Devolucao SD where SD.idMateriaPrima=MP.idMateriaPrima) as Saida_Devolucao,
(select sum(QuantBaixa) from #Transferencia_Baixa where idMateriaPrima=MP.idMateriaPrima) as Transferecia_Baixa,
(select sum(QuantBaixa) from #Transferencia_Devolucao where idMateriaPrima=MP.idMateriaPrima) as Transferecia_Devolucao,
(((select sum(SB.QuantBaixa) from #Saida_Baixa SB where SB.idMateriaPrima=MP.idMateriaPrima)-
  (select sum(SD.QuantBaixa) from #Saida_Devolucao SD where SD.idMateriaPrima=MP.idMateriaPrima)) +
((select sum(QuantBaixa) from #Transferencia_Baixa where idMateriaPrima=MP.idMateriaPrima) - 
 (select sum(QuantBaixa) from #Transferencia_Devolucao where idMateriaPrima=MP.idMateriaPrima))) as Total
from #MateriaPrima MP 
group by MP.idMateriaPrima, MP.descricaoMateriaPrima order by MP.idMateriaPrima

Uma dica: postei em outro tópico, uma dica interessante sobre criação de tabela que faz calculos básicos dinamicamente. Não sei se é o caso, mas vale a pena conhecer:

http://scriptbrasil.com.br/forum/index.php?showtopic=153403

Link to post
Share on other sites
  • 0

Boa tarde fulvio. Impressionante, fiquei 1 semana tentando resolver esse problema, gastando média de 2h por dia e não consegui.

Usei Inner Join, Left Join, Union, fiz 4 select separados e tentei salvar em uma variavel....

Seu código retornou os dados perfeitamente. Muito obrigado pela ajuda. Sou novo no fórum e gostei da atenção da galera.

Obrigado também ao Denis Courcy e ao Tchello.

Pode colocar o post como resolvido.

PS: Visitei o outro link. Eu não sei muito sobre SQL, e isso me ajudou.

Bráulio

Edited by Braulio Ribeiro
Link to post
Share on other sites
  • 0

Rs... de nada. Precisando estamos aí.

Outra coisa importante que dá um trabalho feio: quando se utiliza o Left/right Join, os relacionamento vão se exponencializando... ao utilizar a função SUM, torna-se muito dificil ter uma soma "adequada". Uma dica interessante é utilizar o SUM mais simples possível. :.)

Link to post
Share on other sites
  • 0

Depois de muita pesquisa e dor de cabeça, consegui utilizando as dicas deste post. Ficou assim:

(MySql Workbenk)

select straight_join produto.Nome_Produto, sum(quantidade_entrada) as 'Entrada', sum(quantidade_saida) as 'saida',
(sum(quantidade_entrada) - sum(quantidade_saida)) as 'Total'
from produto
left join entrada on entrada.Cod_produto = produto.Cod_Produto
left join saida on saida.Cod_Produto = produto.Cod_Produto
group by produto.nome_produto

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Cloud Computing


  • Forum Statistics

    • Total Topics
      149287
    • Total Posts
      645679
×
×
  • Create New...