SELECT MAX
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
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
Curtidas 0
Respostas
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:
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
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
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
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:
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
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:
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