2009-03-27 10 views
0

Dies ist meine SQL-Anweisung, arbeitet mit datediff:Mit datediff in MySQL-Anweisung

:

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 

ich das Fest programmierte Datum '2006-05-05' mit MAX (b134_recdate) wie so ersetzen müssen

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 

Aber ich bekomme diese Fehlermeldung:

ein Aggregat kann nicht in der WHERE-Klausel erscheinen, wenn es in einer Unterabfrage in einer HAVING claus enthalten ist e oder eine Auswahlliste, und die aggregierte Spalte ist eine äußere Referenz.

Irgendeine Idee, wie man meine SQL Aussage repariert?

Antwort

5

Versuchen

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

Dies adressiert die "oder eine Auswahlliste", wie von der Fehlermeldung vorgeschlagen –

+0

Wie es steht, kann die Abfrage keinen Index nutzen, der auf b134_recdate (außer für die max) sein könnte. Wenn es "wo B134_rec_date> DateAdd (dd, getDate(), 90)" wäre, würde es einen Index verwenden, falls er existiert. NB: Ich bin mir nicht sicher, ob die Datumssyntax korrekt ist, aber Sie bekommen die Idee. –

0

Haben Sie versucht zu bewegen:

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

zu einer HAVING-Klausel?

würde die SQL-Anweisung sein:

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

dieses ja versucht. Nachdem ich datediff (dd, MAX (b134_recdate), getdate())> 90 ......... dann bekomme ich die Fehlermeldung "Falsche Syntax in der Nähe des Schlüsselwortes 'GROUP'" – Etienne

+0

"wo" begrenzt die Zeilen, die sind gruppiert, "mit" Grenzen, welche Gruppen zurückgegeben werden. das wird nicht genau funktionieren –

+0

Recaddate in "Haben" bedeutet, dass Sie nicht gruppieren können. –

0

Dieser Code ist für SQL Server

Ich bin mir nicht sicher, ob der MAX für die gesamten seine sould Tabelle:

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 

oder pro Gruppe:

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 

aber man konnte diese eine geben versuchen