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