2009-03-27 6 views
0

déclaration Ceci est mon instruction SQL qui fonctionne à l'aide datediff:Utiliser datediff dans MySQL

SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate 
FROM B134HREC 
WHERE datediff (dd, '2006-05-05', getdate()) > 90 
GROUP BY b134_rmcid, b134_recdate 
ORDER BY b134_recdate DESC, b134_rmcid 

Je dois remplacer la date Hardcoded '2006-05-05' avec MAX (b134_recdate) comme ceci:

SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate 
FROM B134HREC 
where datediff (dd, MAX(b134_recdate), getdate()) > 90 
GROUP BY b134_rmcid, b134_recdate 
ORDER BY b134_recdate DESC, b134_rmcid 

Mais je reçois ce message d'erreur:

un agrégat peut ne pas apparaître dans la clause WHERE à moins qu'il soit dans une sous-requête contenue dans un CLAUS e ou une liste de sélection, et la colonne en cours d'agrégation est une référence externe.

Une idée de comment réparer mon instruction SQL?

Répondre

5

Essayez

SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate 
FROM B134HRE 
where datediff (dd, 
     (select MAX(b134_recdate) from B134HRE) 
     , getdate()) > 90 
GROUP BY b134_rmcid, b134_recdate 
ORDER BY b134_recdate DESC, b134_rmcid 
+0

Cela répond à la "ou une liste de sélection" comme suggéré par le message d'erreur –

+0

En l'état la requête ne peut tirer parti d'aucun index qui pourrait être sur b134_recdate (sauf pour le max). Si c'était "où B134_rec_date> DateAdd (dd, getDate(), 90)" il utiliserait un index, s'il existait. NB: Je ne sais pas si la syntaxe de dateadd est correcte, mais vous avez l'idée. –

0

Avez-vous essayé de déplacer ceci:

datediff (dd, MAX(b134_recdate), getdate()) > 90

à une clause HAVING?

L'instruction SQL serait:

SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate FROM B134HRE GROUP BY b134_rmcid, b134_recdate ORDER BY b134_recdate DESC, b134_rmcid HAVING datediff (dd, MAX(b134_recdate), getdate()) > 90

+0

Essayé ce oui. Ayant datediff (dd, MAX (b134_recdate), getdate())> 90 ......... puis j'obtiens le message d'erreur "Syntaxe incorrecte près du mot clé 'GROUP'" – Etienne

+0

"où" limite les lignes qui sont groupé, "ayant" limite les groupes qui sont renvoyés. cela ne fonctionnera pas exactement pareil –

+0

Mettre recdate dans "avoir" signifie que vous ne pouvez pas le grouper par lui. –

0

Ce code est pour le serveur SQL

Je ne sais pas si le MAX sould soit pour l'ensemble table:

DECLARE @MaxDate datetime 
SELECT @MaxDate=MAX(b134_recdate) FROM B134HRE 
/* if you don't want time you need to trim it from @maxDate*/ 

    SELECT 
     SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate 
     FROM B134HRE 
     where datediff (dd, @MaxDate, getdate()) > 90 
     GROUP BY b134_rmcid, b134_recdate 
     ORDER BY b134_recdate DESC, b134_rmcid 

ou par chaque groupe:

SELECT 
    SUM(b.b134_nettpay) AS Total, b.b134_rmcid, b.b134_recdate 
    FROM B134HRE b 
     INNER JOIN (SELECT 
         b134_rmcid, b134_recdate , MAX(b134_recdate) AS MaxDate 
         FROM B134HRE 
         GROUP BY b134_rmcid, b134_recdate 
        ) dt ON b.b134_rmcid=dt.b134_rmcid AND b.b134_recdate=dt.b134_recdate 
    where datediff (dd, dt.MaxDate, getdate()) > 90 
    GROUP BY b.b134_rmcid, b.b134_recdate 
    ORDER BY b.b134_recdate DESC, b.b134_rmcid 

mais vous pouvez donner ces essayer

Questions connexes