SQL与条件和

我目前有一个大的SQL语句,我添加下面的行来获取每个事务ID(这是唯一的)的总现金:

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 

对不起,我没有整个的声明,但它是真的很长,特定于存储过程的上下文,但希望有人知道我的意思?

试试这个:

 SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END) 

说明

您的CASEexpression式的语法不正确。 看来你正在混淆简单的CASEexpression式语法与search的CASEexpression式语法。 请参阅CASE的文档 :

CASEexpression式有两种格式:

  • 简单的CASEexpression式将expression式与一组简单的expression式进行比较,以确定结果。
  • search的CASEexpression式计算一组布尔expression式来确定结果。

你想要search的CASEexpression式语法:

 CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END 

作为一个侧面说明,如果性能是一个问题,您可能会发现,如果使用JOIN和GROUP BY而不是使用从属子查询来重写,则此expression式运行速度会更快。

尝试移动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,因为你正在做一笔总和。 它既能正确的工作,也可能更能说明你的意图。