Ошибка в операторе суммы case с датой между

Я пытаюсь создать оператор, который будет извлекать некоторую статистику из базы данных.

Я пытаюсь использовать оператор SUM case для получения количества записей, у которых есть дата соединения между началом и концом предыдущего года, однако я продолжаю получать сообщение об ошибке:

Сообщение 156, уровень 15, состояние 1, строка 22
Неверный синтаксис рядом с ключевым словом "BETWEEN"

SELECT
    P.ProductName
    ,SUM(case M.IsActive when 1 then 1 else 0 end) ACTIVE
    ,SUM(case M.IsActive when 0 then 1 else 0 end) INACTIVE
    ,SUM(case m.joindate WHEN m.joindate BETWEEN DATEADD(yy, DATEDIFF(yy, 0,    GETDATE()) - 1, 0) AND DATEADD(dd, -1, DATEADD(yy, DATEDIFF(yy, 0,  GETDATE()), 0)) THEN 1 ELSE 0) AS '2018'
FROM 
    table1 M
LEFT JOIN 
    table2 P ON P.ProductID = M.ProductID
GROUP BY 
    P.ProductName

Я просмотрел ошибку в Интернете, и было рекомендовано попытаться удалить m.joindate, чтобы это было SUM (Случай WHEN, но это тоже не сработало и выдало такое же сообщение.

Кто-нибудь знает, почему появляется это сообщение? Это то, что вы не можете использовать BETWEEN в заявлении case, или я написал это неправильно?

заранее спасибо


person Jessica Nutt    schedule 12.08.2019    source источник
comment
Вы не можете использовать BETWEEN при использовании синтаксиса CASE {expression} WHEN... Вам необходимо использовать CASE WHEN {boolean Expression}. При использовании формата CASE {expression} WHEN {Value} WHEN должно быть скалярным выражением. Т.е. CASE YourColumn WHEN 1 THEN ... WHEN 2 THEN... Кроме того, в том же CASE выражении отсутствует END.   -  person Larnu    schedule 12.08.2019


Ответы (1)


Вы неправильно сформулировали третье выражение. Вот один из способов сделать это:

COUNT(CASE WHEN m.joindate BETWEEN
    DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) - 1, 0) AND
    DATEADD(dd, -1, DATEADD(yy, DATEDIFF(yy, 0,  GETDATE()), 0))
    THEN 1 END) AS [2018]

Обратите внимание, что я использовал COUNT вместо SUM, что устраняет необходимость в явном условии ELSE.

Форма выражения CASE, которое вы использовали, работает только в том случае, если значения предиката являются константами (а не предложением BETWEEN). Итак, для надуманного примера сработает следующее:

CASE color
    WHEN 'red'   THEN 'R'
    WHEN 'blue'  THEN 'B'
    WHEN 'green' THEN 'G' END AS label

Эта версия полезна, поскольку не требует повторения проверяемого значения несколько раз.

person Tim Biegeleisen    schedule 12.08.2019