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


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

1324   2  
sql

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

    Ничего не найдено.