【发布时间】:2015-12-22 16:20:25
【问题描述】:
我有一个如下所示的表格:
Year Value
-----------------
2013 -0.0016
2014 -0.0001
2015 0.0025
2016 -0.0003
2017 0.0023
2018 0.0002
我需要执行一个条件聚合来生成一个新列。条件如下:
如果值为负,则聚合开始,直到值为正时才停止。然后什么都没有,直到值再次为负......结果将如下所示:
Year Value AggCol
2013 -0.0016 -0.0016
2014 -0.0001 -0.0017
2015 0.0025 0.0008
2016 -0.0003 -0.0003
2017 0.0023 0.002
2018 0.0002 0.0002
这个 udf 和我得到的一样接近:
create function dbo.fn(@cYear numeric, @rate float)
returns float
as
begin
declare @pYear numeric
declare @return float
set @pYear = @cYear - 1
set @return = (select
case
when Value < 0 and @rate > 0 then null
when Value < 0 then Value + @rate
else @rate
end
from Table1
where [year] = @pYear)
return @return
end
如果这会更容易但更喜欢 SQL,我可以在 c# 中回答。我制作的函数的问题是,当值为正时,我需要能够从上一行中获取结果以添加到值中。
我在这里彻夜未眠,寻找线索却没有乐趣......
编辑:因此,将这些视为您的运营商将应用于您的手机账单的年度 CPI 值......他们只会根据 CPI 增加您的账单,而不会减少它(如果 CPI 为负数) ...但如果当年的 CPI 为正(或总和为正),它们将用当年的 CPI 抵消前几年的负 CPI...
这可能有帮助,也可能没有帮助,但情况就是这样,哈哈。
【问题讨论】:
-
您使用的是什么版本的 SQL Server?
-
您可以使用 SQL Server 中的查询来执行此操作,但它需要递归 CTE。
-
2012 年,我对 CTE 没问题...有 dbo 访问权限,所以可以做任何需要的事情。
-
“直到值为正”,你是指表中的值还是累加和?
-
直到表中的值为正。
标签: c# sql sql-server sql-server-2012