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不太正确我添加了一个案例,它应该能容纳你的负百分比