COMO FACO ESTA PESQUISA?
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
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
A consulta da forma que foi colocada pode gerar erros caso haja algum registro do ano corrente. Eu faria a consulta da seguinte forma:
Espero ter ajudado.
SELECT TOP 1 * FROM Movimento M WHERE (M.ano = YEAR(GETDATE())-1) AND (IDemp=1) ORDER BY m.data DESC;
Espero ter ajudado.
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
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
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;
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