Jump to content
mau rs

Ajuda para montar query no oracle

Recommended Posts

Pessoal, preciso de uma ajuda para montar uma query, vou dizer qual o cenário que tenho. Essas são as tabelas:

- produtos

- custo

- valorvenda

onde a tabela de produtos tem:

id

nome

a tabela de custo tem:

idproduto

vlrcusto

a tabela valorvenda tem:

idproduto

vlrvenda

As tabelas custo e valorvenda guardam um historico de alterações de preços de custo e de venda. Portanto registram muitos registros pra um. Gostaria de fazer uma query que me retornasse uma lista de produtos com o ultimo valor de custo e o ultimo valor de venda. Alguém poderia me ajudar nisso?

Share this post


Link to post
Share on other sites

Olá, consegui chegar aqui:

SELECT
tbproduto.CODPROD codproduto,
tbproduto.DESCRPROD,
tbcusto.CUSREP,
tbvenda.VLRVENDA
FROM
SISTEMA.TGFPRO tbproduto
INNER JOIN SISTEMA.TBLCUS tbcusto ON tbcusto.CODPROD = tbproduto.CODPROD
INNER JOIN SISTEMA.TBLVEN tbvenda ON tbvenda.CODPROD = tbproduto.CODPROD
WHERE
tbproduto.CODPROD = 7734
AND
tbcusto.CUSREP IN (SELECT d.CUSREP
		FROM (SELECT ddd.CUSREP
					FROM SISTEMA.TBLCUS ddd
					WHERE ddd.CODPROD = 7734
					ORDER BY ddd.DTATUAL DESC
				 ) d
		WHERE ROWNUM <= 1)
AND
tbvenda.VLRVENDA IN (SELECT t.VLRVENDA
		FROM (SELECT ttt.VLRVENDA
					FROM SISTEMA.TBLVEN ttt
					WHERE ttt.CODPROD = 7734
					ORDER BY ttt.ID DESC
				 ) t 
		WHERE ROWNUM <= 1)

Mas como você pode ver tem um id fixado ali, no caso só pesquisa por somente um id. Não consigo fazer pra funcionar em todos os produtos. Tentei com esse código abaixo mas não funciona.

SELECT
tbproduto.CODPROD codproduto,
tbproduto.DESCRPROD,
tbcusto.CUSREP,
tbvenda.VLRVENDA
FROM
SISTEMA.TGFPRO tbproduto
INNER JOIN SISTEMA.TBLCUS tbcusto ON tbcusto.CODPROD = tbproduto.CODPROD
INNER JOIN SISTEMA.TBLVEN tbvenda ON tbvenda.CODPROD = tbproduto.CODPROD
WHERE
tbproduto.CODPROD > 0
AND
tbcusto.CUSREP IN (SELECT d.CUSREP
		FROM (SELECT ddd.CUSREP
					FROM SISTEMA.TBLCUS ddd
					WHERE ddd.CODPROD = tbproduto.CODPROD
					ORDER BY ddd.DTATUAL DESC
				 ) d
		WHERE ROWNUM <= 1)
AND
tbvenda.VLRVENDA IN (SELECT t.VLRVENDA
		FROM (SELECT ttt.VLRVENDA
					FROM SISTEMA.TBLVEN ttt
					WHERE ttt.CODPROD = tbproduto.CODPROD
					ORDER BY ttt.ID DESC
				 ) t 
		WHERE ROWNUM <= 1)

Share this post


Link to post
Share on other sites

pensei em algo como


...

tbcusto.DTATUAL = ((SELECT max(ddd.DTATUAL)

FROM SISTEMA.TBLCUS ddd

WHERE ddd.CODPROD = tbproduto.CODPROD

ORDER BY ddd.DTATUAL DESC)

AND

tbvenda.id =(SELECT max(ID)=

FROM SISTEMA.TBLVEN ttt

WHERE ttt.CODPROD = tbproduto.CODPROD

ORDER BY ttt.ID DESC=)

...

Share this post


Link to post
Share on other sites

Mas dessa forma ele não busca somente a data na tabela de custos e o id na tabela de valor de venda? O que preciso era pegar os ultimos valores de custos baseados na data que foi adicionado e o ultimo valor de venda baseado no ultimo id adicionado.

Share this post


Link to post
Share on other sites

--ultimo valor de custo e o ultimo valor de venda

select *
from produtos p, custo c1 ,venda v1
where p.id = c1.idproduto
and p.id = v1.idproduto
and c1.data = (select max(data) from custo c2 where c2.idproduto - p1.idproduto)
and v1.data = (select max(data) from venda v2 where v2.idproduto - v1.idproduto)

Share this post


Link to post
Share on other sites

Adaptei ao meu caso e funcionou perfeitamente por enquanto, tenho que checar se falta alguma coisa mas sua lógica me ajudou bastante inclusive didaticamente. Muito Obrigado.

Share this post


Link to post
Share on other sites

--ultimo valor de custo e o ultimo valor de venda

select *
from produtos p, custo c1 ,venda v1
where p.id = c1.idproduto
and p.id = v1.idproduto
and c1.data = (select max(data) from custo c2 where c2.idproduto - p1.idproduto)
and v1.data = (select max(data) from venda v2 where v2.idproduto - v1.idproduto)

Só mais uma dúvida, se por exemplo um produto não tem valor de venda ainda, mas quero apresentar ele na minha consulta mesmo assim, é possivel fazer?

Share this post


Link to post
Share on other sites

Gostaria de fazer como o left join e right join, que mesmo sem ter um item em alguma tabela, ele apareça.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.