Использование datediff в операторе MySQL

Это мой оператор SQL, который работает с использованием datediff:

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

Мне нужно заменить жестко закодированную дату «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

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

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

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


person Etienne    schedule 27.03.2009    source источник


Ответы (3)


Пытаться

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
person Binary Worrier    schedule 27.03.2009
comment
Это относится к списку выбора или, как предлагается в сообщении об ошибке. - person Binary Worrier; 27.03.2009
comment
В нынешнем виде запрос не может использовать какой-либо индекс, который может быть в b134_recdate (кроме max). Если бы это было где B134_rec_date › DateAdd(dd, getDate(), 90), то использовался бы индекс, если бы он существовал. NB: Не уверен, что синтаксис dateadd правильный, но вы поняли идею. - person Binary Worrier; 30.03.2009

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

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

person Sam    schedule 27.03.2009
comment
Пробовал это да. Имея datediff (dd, MAX(b134_recdate), getdate()) › 90.........затем я получаю сообщение об ошибке Неверный синтаксис рядом с ключевым словом «ГРУППА» - person Etienne; 27.03.2009
comment
где ограничивает сгруппированные строки, имея ограничения на возвращаемые группы. это не будет работать точно так же - person KM.; 27.03.2009
comment
Ввод recdate в наличие означает, что вы не можете группировать по нему. - person Binary Worrier; 27.03.2009
comment
забавно, должно сработать... как тогда было все заявление? Был ли последний пункт? - person Sam; 27.03.2009

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

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

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

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

person KM.    schedule 27.03.2009