sql(初学者)-使用从上述单元格计算的值
编辑 表中的值可以是负数抱歉在提问时疏忽了 在用尽所有搜索努力后,我非常坚持以下几点: 我想根据初始值计算一个运行总数。例如: 我的桌子看起来像:sql(初学者)-使用从上述单元格计算的值,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,编辑 表中的值可以是负数抱歉在提问时疏忽了 在用尽所有搜索努力后,我非常坚持以下几点: 我想根据初始值计算一个运行总数。例如: 我的桌子看起来像: Year Percent Constant ==== ===== ======== 2000 1.40 100 2001 -1.08 100 2002 1.30 100 预期的结果是: Year Percent Constant RunningTotal ==== ====== =
Year Percent Constant
==== ===== ========
2000 1.40 100
2001 -1.08 100
2002 1.30 100
预期的结果是:
Year Percent Constant RunningTotal
==== ====== ======== ============
2000 1.40 100 140
2001 -1.08 100 128.8
2002 1.30 100 167.44
取计算值1.40*100,乘以下一行的百分比1.08,依此类推
我正在使用Sql Server 2012。我已经研究过如何使用一个常用的表表达式,但遗憾的是,似乎无法获得正确的语法。使用LEAD关键字
SELECT
Year
, Percent
, Constant
, Percent * Constant * (LEAD(Percent) OVER(ORDER BY Year)) as RunningTotal
FROMYourTable
这是SQL Server 2012+中MSSQL 2012中的新关键字,您将使用累积总和:
select t.*,
(const * sum(1 + percent / 100) over (order by year)) as rolling_sum
from t
order by t.year;
编辑:
哎呀,我注意到你似乎真的想要累积产品。假设百分比始终大于0,则只需使用日志:
select t.*,
(const * exp(sum(log(1 + percent / 100)) over (order by year))) as rolling_product
from t
order by t.year;
您可以使用递归CTE完成此任务
;WITH values_cte AS (
SELECT [Year]
,[Percent]
,[Constant]
,CASE WHEN [v].[Percent] < 0 THEN
[v].[Constant] - (([v].[Percent] + 1) * [v].[Constant])
ELSE
[v].[Percent] * [v].[Constant]
END
AS [RunningTotal]
FROM [#tmp_Values] v
WHERE [v].[Year] = 2000
UNION ALL
SELECT v2.[Year]
,v2.[Percent]
,v2.[Constant]
,CASE WHEN [v2].[Percent] < 0 THEN
[v].[RunningTotal] + (([v2].[Percent] + 1) * [v].[RunningTotal])
ELSE
[v2].[Percent] * [v].[RunningTotal]
END
AS [RunningTotal]
FROM values_cte v
INNER JOIN [#tmp_Values] v2 ON v2.[Year] = v.[Year] + 1
)
SELECT *
FROM [values_cte]
注意:lead是一个窗口/聚合函数。这不是一个关键词。答案不正确,但术语可以是.hm。很抱歉,我以前的回答不正确。这会更好:百分比*常量*ISNULLLAGPercent OVERORDER BY Year ASC,1 as runningTotal我将进行一点测试,看看随着数据集变大性能的变化。与递归cte相比,在这个小数据集上查看此解决方案的执行计划时,cte需要1/2的时间。你知道为什么会这样吗?虽然还不是很大的一组,但1000条记录的性能差异仍然是一样的。但是,您的解决方案不必考虑MAXRECURSION。。。。似乎值得付出时间代价。@NateAnderson。在更大的数据集上,我预计累计总和将远远超过CTE。CTE工作得如此之好,这让我感到惊讶。这就是我最初的工作目标,并且很有效。然而,这里的问题是当数据集有负数时,我之前忘记了包括负数。结果RunningTotal不正确。我试着用一个案例来检查percep是否<0和>0,但RunningTotal不太正确我添加了一个案例,它应该能容纳你的负百分比