GARANTIR DESCONTO

Fórum Duvida em SubConsulta SQL #205949

12/01/2004

0

Tenho 3 tabelas

Produtos
Entradas
Saídas

A tabela produtos possui os seguintes campos
Cod_Produto
Descricao_Produto
Valor_Produto

A tabela Entradas possui os seguintes campos
Cod_Entrada
Cod_Produto
Quant_Entrada

A tabela Saidas possui os seguintes campos
Cod_Saida
Cod_Produto
Quant_Saida

Agora preciso fazer uma consulta para exibir todos os produtos até mesmo aqueles que não possuem entradas ou saídas e exibir a soma das quantidades de entradas e soma das quantidades de saídas. A SQL abaixo faz a soma só que se possuir o mesmo produto com entradas e saídas ele soma a quantidade duas vezes.
Se alguém puder dizer-me o que está dando errado nesta sql ficarei muito grato.

Select Cod_Produto,
sum(I.Quant_Saida) as Saida, sum(E.Quant_Entrada) as Entrada from ((Produto P
left outer join Saida I on (P.Cod_Produto=I.Cod_Produto))
left outer join Entrada E on (P.Cod_Produto=E.Cod_Produto))
group by Cod_Produto;


João Silva

João Silva

Responder

Posts

13/01/2004

João Silva

:) Obrigado Emerson pela ajuda, espero que dê certo, pois já estou à vários dias quebrando a cabeça com isso.


Responder

Gostei + 0

13/01/2004

João Silva

na tabela produtos possuo os seguintes registros:

cod_Produto Descricao Preco
0000000001 CAFÉ PRETO 250G R$ 2,50
0000000002 ARROZ TIPO 1 R$ 10,50
0000000003 LEITE EM PÓ 200G R$ 5,00

Na tabela Entradas possuo os seguintes registros:
cod_entrada cod_Produto quantidade
01 0000000002 25
02 0000000003 10
01 0000000002 10

Na tabela Saidas possuo os seguintes registros:
cod_Saida cod_produto quantidade
01 0000000002 5
02 0000000003 7


quando faço a consulta o resultado é o seguinte:

cod_produto descrição Quant. Entrada Quant. Saida
0000000001 CAFÉ PRETO 250G 0 0
0000000002 ARROZ TIPO 1 35 10
0000000003 LEITE EM PÓ 200G 10 7


Neste resultado observa-se que o produto de código 2, ou seja o ARROZ TIPO 1 apresenta um erro na soma da quantidade que deveria ser 5 e está 10. Isso porque foi feita a soma duas vezes devido ao fato de existirem dois registro deste produto na tabela Entradas. Ai eu pergunto será que é possível resolver este problema na SQL abaixo:

Select P.Cod_Produto,
sum(I.Quant_Saida) as Saida,
sum(E.Quant_Entrada) as Entrada
from Produto P
left join Saida I on (I.Cod_Produto = P.Cod_Produto)
left join Entrada E on (E.Cod_Produto = P.Cod_Produto)
group by P.Cod_Produto
order by P.Cod_Produto


Responder

Gostei + 0

13/01/2004

E_marcello

Estou com um problema parecido com o seu - a diferença é que ainda quero filtrar por data -, tentei usar a dica que Emerson lhe forneceu e deu o mesmo erro.


Responder

Gostei + 0

13/01/2004

João Silva

Mais uma vez te agradeço Emerson por sua ajuda.


Responder

Gostei + 0

13/01/2004

João Silva

É Emerson! as duas maneiras que você enviou não deu certo, espero que tenha mais alguma porque o meu tempo de entregar este sistema está se esgotando e acho que vou perde o cliente.


Responder

Gostei + 0

13/01/2004

João Silva

Digitei assim e deu tudo zerado!

SELECT P.Nr_Produto, P.Descricao,
(Select sum(ItemPed.Quantidade) From ItemPed Where ItemPed.Nr_Produto=P.Nr_Produto) Saida,
(Select sum(Entrada.Quantidade) From Entrada Where Entrada.Cod_Produto=P.Nr_Produto) Entrada
From Produto P
Order by p.Descricao


Responder

Gostei + 0

13/01/2004

João Silva

Os campos são todos iguais e quando eu uso a SQL abaixo a soma é efetuada só que se existir mais de um registro do mesmo produto na tabela Entrada a soma na tabela Saida e feita na mesma quantidade de registro ou seja a soma é realizada duas vezes no mesmo produto na tabela Saida. Além do mais o seu exemplo você não usa group by e pelo que já tenho visto toda vez que se usa Sum tem que usar group by, ou estou errado?

Select Nr_Produto,
sum(I.Quantidade) as Quant, sum(E.Quantidade) as Quant2 from ((Produto P left outer join ItemPed I on
(P.Nr_Produto=I.Nr_Produto))
left outer join Entrada E on
(P.Nr_Produto=E.Cod_Produto)) group by
Nr_Produto;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar