Подтвердить что ты не робот

Сумма 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

Извините, что у меня нет всего утверждения, но оно действительно длинное и специфичное для контекста хранимой процедуры, но надеялось, что кто-то узнает, что я имею в виду?

4b9b3361

Ответ 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;