Jump to content
vikcch

[Resolvido] MAX(date) com WHERE

Recommended Posts

vikcch

Olá a todos!!!

Tenho a seguinte tabela:

Multicare

  ID  |  SocioID   |  Pagamento   | ValidoAte
----------------------------------------------
1         5             10        16/6/2015
2         5             4         16/6/2015
3         5             13        16/6/2016

Preciso que o retorno seja os campos SocioID e ValidoAte dos socios que tem o campo ValidoAte com a data maior, e que seja menor que a data do fim do mes. ou seja quem tem o pagamento em atraso

Esta query retorna-me a validade de cada socio:

SELECT SocioID AS ID, MAX(ValidoAte) AS Validade FROM Multicare GROUP BY SocioID

retorno:

SocioID  | ValidoAte
5   |  16/6/2016

Mas quando faço um criterio (WHERE ValidoAte <= #06-30-2015#) retorna a data maior mas menor que esta #06-30-2015#

SELECT SocioID AS ID, MAX(ValidoAte) AS Validade FROM Multicare WHERE ValidoAte <= #06-30-2015# GROUP BY SocioID

retorno:

SocioID  | ValidoAte
5   |  16/6/2015

E eu queria que não retornasse nada porque a data do ID 3 é a maior e é maior que o criterio...

Edited by vikcch

Share this post


Link to post
Share on other sites
KTachyon

No fundo, aquilo que queres é agrupar por sócio, ordenado por data descendente, com limite 1:

GROUP BY SocioID
ORDER BY ValidoAte DESC
LIMIT 1

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
carlosAl

divide a tua consulta em duas :

a primeira que chamo (qry1) :

SELECT Multicare.SocioID, Max(Multicare.ValidoAte) AS Validade
FROM Multicare
GROUP BY Multicare.SocioID;

a segunda que chamo (qry2) e que é baseada na (qry1) :

SELECT qry1.SocioID, qry1.Validade
FROM qry1
WHERE (((qry1.Validade)<=#6/30/2015#));

ao correres a qry2 , obtens o resultado que pretendes.

Share this post


Link to post
Share on other sites
vikcch

Obrigado aos dois por responderem!!!

No fundo, aquilo que queres é agrupar por sócio, ordenado por data descendente, com limite 1:

GROUP BY SocioID
ORDER BY ValidoAte DESC
LIMIT 1

parece que o access não tem LIMIT, alguma outra alternativa? vi que tem TOP mas acho que não se encaixa no que pretendo...

divide a tua consulta em duas :

a primeira que chamo (qry1) :

SELECT Multicare.SocioID, Max(Multicare.ValidoAte) AS Validade
FROM Multicare
GROUP BY Multicare.SocioID;

a segunda que chamo (qry2) e que é baseada na (qry1) :

SELECT qry1.SocioID, qry1.Validade
FROM qry1
WHERE (((qry1.Validade)<=#6/30/2015#));

ao correres a qry2 , obtens o resultado que pretendes.

Estou a usar o C# e o resultado das minhas querys vão para uma datatable, para onde vai o resultado dessa qry1? não dá pra juntar essas 2 querys numa só?

Eu até conseguia fazer o filtro depois na datatable, mas queria fazer logo pela query...

desculpem lá a nobice

Share this post


Link to post
Share on other sites
vikcch

Acho que achei a solução para o que pretendia...

SELECT SocioID, MAX(ValidoAte) FROM Multicare GROUP BY SocioID HAVING MAX(ValidoAte) <= #06-30-2015#

devia ser por isto:

"The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions."

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.