Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, preciso de uma ajuda para montar uma query, vou dizer qual o cenário que tenho. Essas são as tabelas:
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?
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)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)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)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=)
...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.
--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)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.
>
--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?
Gostaria de fazer como o left join e right join, que mesmo sem ter um item em alguma tabela, ele apareça.
Veja se istoajuda.