繁体   English   中英

在SQL Server中将CASE语句与SUM函数一起使用

[英]Use CASE statement with SUM function in SQL Server

我正在使用SQL Server 2008 R2。 我正在努力求和。

这是我的查询

select  
  SUM(
    case 
      when sec.SecurityTypeID =  2 then SUM(quantity)*(sec.AnnualIncomeRate/100) 
      when sec.SecurityTypeID = 5 then 0 
      when sec.SecurityTypeID = 11 then SUM(quantity)*sec.AnnualIncomeRate    
      else SUM(quantity)*sec.AnnualIncomeRate   
    end
  ) AS ProjectedIncome 
from Transactions as t

当我执行它时,出现以下错误。

Msg 130,第15级,州1,第3行
无法对包含聚集查询或子查询的表达式执行聚集函数。

我知道我正在使用带有case子句的sum函数。 但是我需要用这个案例陈述来求和。

确实; 这种case是每行的,因为您没有group 当引用单个行时, SUM(quantity)在很大程度上没有意义。 如果这是整个集合的SUM ,则必须首先将其计算为变量。 否则,您将需要考虑将内部SUM应用于哪个组/分区。

举一个类似的例子:

这有效:

select 1 as [a], 2 as [b], 3 as [c]

这有效:

select case [a] when 1 then [b] else [c] end from (
  select 1 as [a], 2 as [b], 3 as [c]
) x

但这不是:

select case [a] when 1 then sum([b]) else [c] end from (
  select 1 as [a], 2 as [b], 3 as [c]
) x

同样,这可行:

select sum(case [a] when 1 then [b] else [c] end) from (
  select 1 as [a], 2 as [b], 3 as [c]
) x

但这没有,给出与您报告相同的错误消息:

select sum(case [a] when 1 then sum([b]) else [c] end) from (
  select 1 as [a], 2 as [b], 3 as [c]
) x

不知道在这种情况下秒是多少,但我会采取这一点并创建一个派生表

select SUM(t.caseValue) AS ProjectedIncome 
from (select * , case 
      when sec.SecurityTypeID =  2 then (quantity)*(sec.AnnualIncomeRate/100) 
      when sec.SecurityTypeID = 5 then 0 
      when sec.SecurityTypeID = 11 then (quantity)*sec.AnnualIncomeRate    
      else (quantity)*sec.AnnualIncomeRate   
end as caseValue  from Transactions) as t

上面的查询可能无法正常工作,因为没有太多信息可以使用

上面的答案解释了为什么查询无法比我的查询更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM