生成日期范围并对每个SQL记录应用计算

生成日期范围并对每个SQL记录应用计算,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有以下案例excel格式: 所以如果我改变上面的参数,记录就会改变。例如,结果如下: 有人知道如何在SQL脚本中实现这一点吗? 谢谢。您可以使用CTE解决此问题 DECLARE @StartDate DATE = '2016-01-01' ,@EndDate DATE = '2016-12-31' ,@MaxValue float = 96 ,@PointValue float = 0.0972 ;WITH ctetest AS (

我有以下案例excel格式:

所以如果我改变上面的参数,记录就会改变。例如,结果如下:

有人知道如何在SQL脚本中实现这一点吗?
谢谢。

您可以使用CTE解决此问题

DECLARE @StartDate DATE = '2016-01-01'
        ,@EndDate  DATE = '2016-12-31'
        ,@MaxValue  float  = 96
        ,@PointValue float =  0.0972
;WITH ctetest AS (
    SELECT @StartDate AS CDate,@MaxValue AS Value
    UNION ALL
    SELECT dateadd(day,1,CDate) ,(1-@PointValue) * Value
    FROM ctetest 
    WHERE dateadd(day,1,CDate)<=@EndDate
)
SELECT * FROM ctetest OPTION (MAXRECURSION 0)

注意:-请检查foluma,并在需要时进行更改。

Msg 530,16级,状态1,第5行语句终止。在语句完成之前,最大递归100已用尽。您必须将选项MAXRECURSION 400添加到cte,因为它将运行超过默认递归100的时间。修改了查询,添加了MAXRECURSION。此外,您还可以根据需要修改MaxValue和PointValue的数据类型。可能重复的
Date           Value
-----------------------------
2016-01-01     96     --> This value is taken from MaxValue Parameter
2016-01-02     95.9   --> It requires a formula, which is (1 - PointValue) * Previous Value
2016-01-03     95.8
ff.
2016-12-31     67.3   --> Last Record, Based on Date Finish. The formula is the same
DECLARE @StartDate DATE = '2016-01-01'
        ,@EndDate  DATE = '2016-12-31'
        ,@MaxValue  float  = 96
        ,@PointValue float =  0.0972
;WITH ctetest AS (
    SELECT @StartDate AS CDate,@MaxValue AS Value
    UNION ALL
    SELECT dateadd(day,1,CDate) ,(1-@PointValue) * Value
    FROM ctetest 
    WHERE dateadd(day,1,CDate)<=@EndDate
)
SELECT * FROM ctetest OPTION (MAXRECURSION 0)