【问题标题】:SQL sum with condition带条件的 SQL 求和
【发布时间】:2010-12-23 10:03:23
【问题描述】:

我目前有一个大型 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 的,对吧?

标签: sql


【解决方案1】:

试试这个:

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

说明

您的 CASE 表达式语法不正确。您似乎将简单的 CASE 表达式语法与搜索的 CASE 表达式语法混淆了。见documentation for CASE

CASE 表达式有两种格式:

  • 简单 CASE 表达式将一个表达式与一组简单表达式进行比较以确定结果。
  • 搜索到的 CASE 表达式对一组布尔表达式求值以确定结果。

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

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

附带说明,如果性能是一个问题,您可能会发现如果您使用 JOIN 和 GROUP BY 而不是使用依赖子查询进行重写,则此表达式运行得更快。

【讨论】:

    【解决方案2】:

    尝试移动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,因为您正在进行求和。它以两种方式都可以正常工作,但可能更能说明您的意图。

    【讨论】:

      【解决方案3】:

      使用条件 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;
      

      【讨论】:

        猜你喜欢
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-29
        相关资源
        最近更新 更多