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) totsaidafrom cadastro_prod, entrada_produtowhere 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 totsaidafrom cadastro_prod, saida_produtowhere 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?
Faz uma junção das tabelas de entrada e saída e subtraia os valores para obter os saldos!
(entrada.quantidade - saida.quantidade) = saldo em estoque
F
forna
Desculpa, não entendi , como ficaria ?
F
forna
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;
O correto seria ele me retornar:
id_prod
nome_prod
atual
1
headset
5
2
mouse
0
J
Jonathan_Medeiros1 like
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_estoquefrom cadastro_prod cpleft 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;
F
forna
Fiz aqui desta forma:
select cp.id_prod, cp.nome_prod, sum(ep.quantidade_entrada) - sum(sp.quantidade_saida) as saldo_estoquefrom cadastro_prod cpleft 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;
E ele me retorna o valor incorreto:
J
Jonathan_Medeiros1 like
Como disse anteriormente…
F
forna
Mas está correto, porém ele não efetua a subtração e não me retorna a diferença dos valores
J
Jonathan_Medeiros
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 exemplosum(ep.quantidade_entrada) - sum(sp.quantidade_saida) as saldo_estoque //Query que você executou
A
AbelBueno3 likes
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.