Estou com dificuldade para montar uma query para exibir o estoque atual, tenho um sistema de estoque que registra a entrada e a saida dos equipamentos, porém preciso exibir o estoque atual.
Até então escrevi isso:
Exibe a soma total de entrada por produto:
select cadastro_prod.id_prod, cadastro_prod.nome_prod, sum(entrada_produto.quantidade_entrada) totsaida
from cadastro_prod, entrada_produto
where id_prod = fk_id_entrada group by nome_prod;
Resultado:
Exibe a soma total de saida por produto:
select cadastro_prod.id_prod, cadastro_prod.nome_prod, sum(saida_produto.quantidade_saida) as totsaida
from cadastro_prod, saida_produto
where id_prod = fk_id_saida group by nome_prod;
Resultado:
Como realizar a query para exibir o estoque atual que tenho ? Minha outra dúvida é referente a foreing key, ao realizar um insert na tabela cadastro_prod como preencher automaticamente as fks nas tabelas entrada_produto e saida_produto?
Escrevi assim, mas ele me retorna o valor incorreto !
select produto.id_prod, produto.nome_prod, sum(entradas.quantidade_entrada - saidas.quantidade_saida) as atual
from cadastro_prod as produto, entrada_produto as entradas, saida_produto as saidas
where produto.id_prod = entradas.fk_id_entrada group by nome_prod;
Essa maneira de informar todas as tabelas da sua consulta no FROM da Query SQL não é mais praticada hoje em dia!
Dê uma estudada sobre o junções de tabelas com JOIN.
Tentei montar aqui como ficaria sua consulta, não tenho como testar, mas em tese acredito que seria mais ou menos isso, qualquer coisa ajuste ela conforme sua necessidade:
select
cp.id_prod,
cp.nome_prod,
sum(ep.quantidade_entrada - sp.quantidade_saida) as saldo_estoque
from
cadastro_prod cp
left join saida_produto sp
on(cp.id_prod = sp.fk_id_saida)
left join entrada_produto ep
on(cp.id_prod = ep.fk_id_saida)
group by
cp.id_prod,
cp.nome_prod;
select
cp.id_prod,
cp.nome_prod,
sum(ep.quantidade_entrada) - sum(sp.quantidade_saida) as saldo_estoque
from
cadastro_prod cp
left join saida_produto sp
on(cp.id_prod = sp.fk_id_saida)
left join entrada_produto ep
on(cp.id_prod = ep.fk_id_entrada)
group by
cp.id_prod,
cp.nome_prod;
Perceba que você aplica dois SUM() separadamente, na query em que fiz como exemplo é aplicado um único SUM().
sum(ep.quantidade_entrada - sp.quantidade_saida) as saldo_estoque //Query do exemplo
sum(ep.quantidade_entrada) - sum(sp.quantidade_saida) as saldo_estoque //Query que você executou
Se você executar essa query sem o group by e sum, e apenas mostrar os valores separados de cada, verá onde está o problema.
Fazendo isso numa query só, você está combinando as linhas de entrada_produto e saida_produto num join, mas sem limitar a relaçao entre eles, causando um produto cartesiano.
Por exemplo: Se para o produto 1, tiver Entrada 10, Entrada 20 e Saida 5, Saida 3, no seu resultado final terá 4 linhas: E10-S5, E10-S3, E20-S5, E20-S3.
Há algumas formas de corrigir isso:
Aplique uma subquery para fazer o sum, ao invés de fazer o join na tabela
Faça o group by em cada tabela primeiro (entrada e saida) e depois o join apenas com os resultados já agrupados.