Сумма SQL с условием
В настоящее время у меня есть большой оператор SQL, в который я добавляю следующую строку, чтобы получить общую сумму для каждого идентификатора транзакции (который уникален):
select sum(cash) from Table a where a.branch = p.branch
and a.transID = p.transID) TotalCash
и теперь мне нужно сделать то же самое, но только общее количество денежных значений, которые имеют значение в течение последнего месяца, поэтому у меня есть что-то вроде этого:
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
Извините, что у меня нет всего утверждения, но оно действительно длинное и специфичное для контекста хранимой процедуры, но надеялось, что кто-то узнает, что я имею в виду?
Ответы
Ответ 1
Попробуйте это вместо:
SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END)
Объяснение
Ваше выражение CASE имеет неправильный синтаксис. Кажется, вы смешиваете простой синтаксис выражения CASE с синтаксисом выражения CASE. См. Документацию для CASE:
Выражение CASE имеет два формата:
- Простое выражение CASE сравнивает выражение с набором простых выражений для определения результата.
- Выбранное выражение CASE оценивает набор булевых выражений для определения результата.
Вы хотите, чтобы искомый синтаксис выражения CASE:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
В качестве побочного примечания, если производительность является проблемой, вы можете обнаружить, что это выражение выполняется быстрее, если вы переписываете использование JOIN и GROUP BY вместо использования зависимого подзапроса.
Ответ 2
Попробуйте переместить 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, так как вы делаете сумму. Он работает правильно в обоих направлениях, но, возможно, более показательны, каковы ваши намерения.
Ответ 3
С условием HAVING вы удалите данные с наличностью, не превышающей 0, если хотите, что повысит эффективность вашего запроса.
SELECT SUM(cash) AS money FROM Table t1, Table2 t2 WHERE t1.branch = t2.branch
AND t1.transID = t2.transID
AND ValueDate > @startMonthDate HAVING money > 0;