带条件的SQL总和


75

我目前有一个大型SQL语句,我在其中添加了以下行,以便获得每个交易ID(唯一)的总现金:

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

抱歉,我没有完整的声明,但是它确实很长且特定于存储过程的上下文,但是希望有人能理解我的意思吗?


根据您的问题历史记录,我认为这是针对SQL Server 2005的,对吧?
Mark Byers 2010年

Answers:


135

尝试以下方法:

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而不是使用从属子查询来重写,则可能会发现该表达式的运行速度更快。


7

尝试移动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。两种方法都可以正常工作,但可能更能说明您的意图。


0

使用条件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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.