带条件的SQL和

Gra*_*ace 58 sql

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

select sum(cash) from Table a where a.branch = p.branch 
and a.transID = p.transID) TotalCash
Run Code Online (Sandbox Code Playgroud)

而我现在需要做同样的事情,但只有在上个月内有一个有价值的现金值,所以我有这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

对不起,我没有完整的声明,但它真的很长,具体到存储过程的上下文,但希望有人知道我的意思?

Mar*_*ers 106

试试这个:

SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)

说明

您的CASE表达式语法不正确.您似乎将简单的CASE表达式语法与搜索的CASE表达式语法混淆.请参阅CASE文档:

CASE表达式有两种格式:

  • 简单的CASE表达式将表达式与一组简单表达式进行比较以确定结果.
  • 搜索到的CASE表达式计算一组布尔表达式以确定结果.

您想要搜索的CASE表达式语法:

CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果性能是一个问题,如果使用JOIN和GROUP BY而不是使用从属子查询重写,则可能会发现此表达式运行得更快.


Jam*_*man 6

尝试移动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
Run Code Online (Sandbox Code Playgroud)

(为清楚起见重新格式化)

您也可以考虑使用'0'而不是NULL,因为您正在进行总和.它可以在两种方式下正常工作,但可能更能说明您的意图.