Сумма SQL с условием
в настоящее время у меня есть большой оператор SQL, в который я добавляю следующую строку, чтобы получить общую сумму денег для каждого идентификатора транзакции (которые уникальны):
select sum(cash) from Table a where a.branch = p.branch
and a.transID = p.transID) TotalCash
и теперь мне нужно сделать то же самое, но только суммировать денежные значения, которые имеют valuedate в течение последнего месяца, поэтому у меня есть что-то вроде этого:
select sum(CASE ValueDate WHEN > @startMonthDate THEN cash ELSE NULL END)
from Table a where a.branch = p.branch and a.transID = p.transID) TotalMonthCash
Извините, что у меня нет всего оператора, но он действительно длинный и специфичный для контекста хранимой процедуры, но надеялся, что кто-то будет понимаешь, о чем я?
2 ответов:
попробуйте это вместо этого:
SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END)объяснение
ваше выражение CASE имеет неправильный синтаксис. Кажется, вы путаете простой синтаксис выражения CASE с синтаксисом выражения искомого случая. Смотрите документация по делу:
выражение CASE имеет два формата:
- простое выражение Case сравнивает выражение с набором простых выражений для определения результат.
- искомое выражение CASE вычисляет набор логических выражений для определения результата.
требуется синтаксис выражения искомого случая:
CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
в качестве примечания, если производительность является проблемой, вы можете обнаружить, что это выражение выполняется быстрее, если вы переписываете с помощью JOIN и GROUP BY вместо использования зависимого подзапроса.
двигался
ValueDate:select sum(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END) from Table a where a.branch = p.branch and a.transID = p.transID(переформатирован для ясности)
вы также можете использовать '0' вместо NULL, как вы делаете сумму. Он работает правильно в обоих направлениях, но, возможно, более показателен для ваших намерений.
Comments