mau rs 37 Denunciar post Postado Outubro 13, 2016 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
Motta 645 Denunciar post Postado Outubro 13, 2016 Veja se isto ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
mau rs 37 Denunciar post Postado Outubro 14, 2016 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
Motta 645 Denunciar post Postado Outubro 14, 2016 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
mau rs 37 Denunciar post Postado Outubro 14, 2016 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
Motta 645 Denunciar post Postado Outubro 15, 2016 --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
mau rs 37 Denunciar post Postado Outubro 15, 2016 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
mau rs 37 Denunciar post Postado Outubro 15, 2016 --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
mau rs 37 Denunciar post Postado Outubro 17, 2016 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