2009-03-27 2 views
0

Это мой SQL заявление, которое работает с использованием DateDiff:Использование DateDiff в заявлении 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 

Мне нужно заменить HARDCODED дату '2006-05-05' с MAX (b134_recdate) следующим образом:

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 

Но я получаю сообщение об ошибке:

агрегат не может появиться в ИНЕКЕ, если оно не находится в подзапроса, содержащегося в HAVING клауса e или список выбора, а агрегированный столбец является внешней ссылкой.

Любая идея, как исправить мое заявление SQL?

ответ

5

Попробуйте

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

Это относится к «или списку выбора», как предложено сообщением об ошибке –

+0

Поскольку он стоит, запрос не может использовать ни один индекс, который может быть на b134_recdate (кроме максимального). Если это «где B134_rec_date> DateAdd (dd, getDate(), 90),« он будет использовать индекс, если он существует. NB: Не уверен, что синтаксис dateadd верен, но вы получаете идею. –

0

Вы пробовали двигаться в этом:

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

в HAVING предложении?

SQL-оператор будет:

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

Пробовал это да. Получив датичный (dd, MAX (b134_recdate), getdate())> 90 ........., тогда я получаю сообщение об ошибке «Неверный синтаксис рядом с ключевым словом« GROUP »« – Etienne

+0

«где» ограничивает строки, которые сгруппированы, «имеющие» пределы, группы которых возвращаются. что не будет работать точно так же. –

+0

Внесение recdate в «having» означает, что вы не можете группировать его. –

0

Этот код для SQL сервера

Я не уверен, если MAX sould быть для всей стол:

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 

или по каждой группе:

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 

но вы могли бы дать этим попробовать

Смежные вопросы