SELECT MAX

Firebird

30/06/2006

8) Ola,

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

Vagner Wolf

Curtidas 0

Respostas

Adrinei

Adrinei

30/06/2006

Comparei cada Cod+Lote com sua última data de entrada.
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
Vagner Wolf

Vagner Wolf

30/06/2006

Desculpe-me a demora em respoder, porem eu nao conhecia o ALIAS DE TABELA, e fui estudar um pouquinho, :lol: eu nao estava entendendo o E1 e o E2, e fui ver se tinha mais algum recurso que eu nao conhecia.

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

Comparei cada Cod+Lote com sua última data de entrada. 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
Vagner Wolf

Vagner Wolf

30/06/2006

COMPLEMENTANDO..,

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
Vagner Wolf

Vagner Wolf

30/06/2006

Mas tive de utilizar uma view.

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
POSTAR