COMO FACO ESTA PESQUISA?

IVANA 25/11/2010 15:44:51
#358222
Olá,

Não estou conseguindo fazer esta consulta: preciso retornar o último registro digitado para o último mês do último ano, para uma dada empresa que será escolhida.

Já tentei fazer assim: select * from Movimento M where M.ano=(select max(m1.ano) from Movimeto m1 where IDemp=1)
and M.mes (select max(m1.mes) from Movimeto m1 where IDemp=1)


Isso falha, claro! Pois eu teria que saber qual é o ano para depois pegar o último mês.

Utilizo SQL Server 2000. Não posso utilizar função ou stored procedure, apenas SQL.

Como eu implementaria isso somente com SQL?

Grata,
Ivana




FFCOUTO 25/11/2010 18:17:57
#358240
Resposta escolhida
A consulta da forma que foi colocada pode gerar erros caso haja algum registro do ano corrente. Eu faria a consulta da seguinte forma:

SELECT TOP 1 * FROM Movimento M WHERE (M.ano = YEAR(GETDATE())-1) AND (IDemp=1) ORDER BY m.data DESC;


Espero ter ajudado.
IVANA 26/11/2010 10:20:06
#358262
Agradeço, rapazes.

FFCOUTO, eu não poderia utilizar a função Top, pois o Hibernate não a reconhece como válida...

LVFIOROT, utilizei uma variação da sua sugestão, que creio ficou até mais ágil. O que faltava na forma que eu estava fazendo era colocar o parentesis para juntar os dois selects.

select *
from dbo.Movimento M
where
M.mes = (select max(m2.mes) from Movimento m2 where m2.IDemp = 1 and m2.ano = (select max(m3.ano) from Movimento m3 where m3.IDemp=1))
and
M.IDemp = 1





O que ainda não ficou muito claro para mim é porque que os dados não são retornados se eu inverter, colocar o ano primeiro, dessa forma:

select *
from dbo.Movimento M
where
m.ano = (select max(m2.ano) from Movimento m2 where m2.IDemp = 1 and m2.mes = (select max(m3.mes) from Movimento m3 where m3.IDemp=1))
and
M.IDemp = 1


Grata,
Ivana

TFPEROZINI 25/01/2011 15:40:54
#363392
ivana, coloque o comando nolock para melhoria de performance e nao concorrer com os operadores:

SELECT TOP 1 * FROM Movimento M [txt-color=#e80000](nolock) [/txt-color]WHERE (M.ano = YEAR(GETDATE())-1) AND (IDemp=1) ORDER BY m.data DESC;

Tópico encerrado , respostas não são mais permitidas