Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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?

Compartilhar este post


Link para o post
Compartilhar em outros 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)

Compartilhar este post


Link para o post
Compartilhar em outros 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=)

...

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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)

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.