Ajuda consulta e inserir valor na foreign key

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:

image

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:

image

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

2 curtidas

Desculpa, não entendi , como ficaria ?

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;

image

O correto seria ele me retornar:

id_prod nome_prod atual
1 headset 5
2 mouse 0

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;
1 curtida

Fiz aqui desta forma:

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;

E ele me retorna o valor incorreto:
image

Como disse anteriormente…

1 curtida

Mas está correto, porém ele não efetua a subtração e não me retorna a diferença dos valores

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.
3 curtidas