Fórum SELECT MAX #56420
30/06/2006
0
Em uma tabela com :
COD
LOTE
VAL CUSTO
VAL VENDA
DATA CADASTRO
tenho lançamentos desde 2003, e no momento gostaria de isolar apenas os últimos valores de VENDA Cadastrados MAIS RECENTEMENTE para TODOS os COD + LOTE registrados:
SELECT DISTINCT TbEstoque.CodProduto, TbEstoque.LoteProduto, TbEstoque.ValCusto, TbEstoque.ValProduto, Max(TbEstoque.DataEntProduto) AS MAxDeDataEntProduto
FROM TbEstoque
GROUP BY TbEstoque.CodProduto, TbEstoque.LoteProduto, TbEstoque.ValCusto, TbEstoque.ValProduto;
Porem ele apresenta varias ocorrências, apresenta todas as vazes em que ocorreram alterações de preço, que nem sempre foram para maior, deste modo não adianta pedir na mesma SQL Max para preço de (custo / venda), por que a única informação confiável é a data mais recente de cadastro.
Caso alguem possa me ajudar agradeço muito!
:lol: Vagner Wolf
Vagner Wolf
Curtir tópico
+ 0Posts
01/07/2006
Adrinei
Se eu entendi bem, acho que era isso que você estava precisando.
Veja se funciona:
SELECT TbEstoque.CodProduto, TbEstoque.LoteProduto, TbEstoque.ValCusto, TbEstoque.ValProduto, TbEstoque.DataEntProduto AS MAxDeDataEntProduto FROM TbEstoque E1 WHERE TbEstoque.DataEntProduto IN (SELECT Max(TbEstoque.DataEntProduto) FROM TbEstoque E2 WHERE (E1.TbEstoque.CodProduto=E2.TbEstoque.CodProduto AND E1.TbEstoque.LoteProduto=E2.TbEstoque.LoteProduto))
Gostei + 0
07/07/2006
Vagner Wolf
Bom o resultado ainda é o mesmo, ele só retorna os registros da data do ultimo cadastro e ignora os outros lançamentos. Sendo o objetivo obter o ULTIMO CADASTRO de TODOS OS REGISTROS.
Assim por exemplo teriamos:
01/01/06 - prod01 - R$ 1,50
02/01/06 - prod01 - R$ 1,75
03/01/06 - prod01 - R$ 1,45
resultado = 03/01/06 - R$ 1,45
:cry: Aparentemente deveria ser simples, mas nao consigo :lol:
8) vagner Wolf
SELECT TbEstoque.CodProduto, TbEstoque.LoteProduto, TbEstoque.ValCusto, TbEstoque.ValProduto, TbEstoque.DataEntProduto AS MAxDeDataEntProduto FROM TbEstoque E1 WHERE TbEstoque.DataEntProduto IN (SELECT Max(TbEstoque.DataEntProduto) FROM TbEstoque E2 WHERE (E1.TbEstoque.CodProduto=E2.TbEstoque.CodProduto AND E1.TbEstoque.LoteProduto=E2.TbEstoque.LoteProduto))
Gostei + 0
07/07/2006
Vagner Wolf
Acho que nao fui muito claro, no exemplo então retificando:
DATA - PRODUTO - LOTE - VALOR
01/01/06 - prod1 - 01 - 1,50
05/01/06 - prod2 - 01 - 1,50
08/01/06 - prod1 - 01 - 1,70
09/01/06 - prod2 - 01 - 1,75
12/01/06 - prod1 - 01 - 1,45
15/01/06 - prod2 - 01 - 1,45
RETORNA:
12/01/06 - prod1 - 01 - 1,45
15/01/06 - prod2 - 01 - 1,45
NO ENTANTO ELE SEMPRE RETORNA APENAS:
15/01/06 - prod2 - 01 - 1,45
Acredito que seja por considerar ( = ao MAX(data)) que seria realmente o dia 15.
Espero ter sido menos confuso :lol:
Gostei + 0
07/07/2006
Vagner Wolf
1º criei uma view ´BaseMarkup´ com a seguite SQL:
SELECT Max(TbEstoque.DataEntProduto) AS MáxDeDataEntProduto, TbEstoque.CodProduto, TbEstoque.LoteProduto
FROM TbEstoque
GROUP BY TbEstoque.CodProduto, TbEstoque.LoteProduto;
2º Depois:
SELECT BaseMarkup.CodProduto, BaseMarkup.LoteProduto, BaseMarkup.MáxDeDataEntProduto, TbEstoque.ValProduto
FROM TbEstoque INNER JOIN BaseMarkup ON (TbEstoque.DataEntProduto = BaseMarkup.MáxDeDataEntProduto) AND (TbEstoque.LoteProduto = BaseMarkup.LoteProduto) AND (TbEstoque.CodProduto = BaseMarkup.CodProduto);
8) Hahaa, agora posso ir dormir sossegado :lol:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)