使用SQL Server 2005中的自定义表达式计算运行的产品

时间:2016-02-11 21:25:20

标签: sql-server sql-server-2005

我有两个表,第一个表section,架构为:

SecID  |      Date     |   SecReturn
-------|---------------|--------------
  208  |   2015-04-01  |   0.00355
  208  |   2015-04-02  |   -0.00578
  208  |   2015-04-03  |   0.00788
  208  |   2015-04-04  |   0.08662
  105  |   2015-04-01  |   0.00786

和第二个表SectionDates,架构为:

SecID |  MonthlyDate  |  DailyDate
------|---------------|-------------
208   |   2015-04-02  |  2015-04-03
105   |   2015-04-01  |  2015-04-01

我想从第二个表格中计算表格SecReturn的{​​{1}}列上的正在运行的产品,其中包含日期范围( DailyDate MonthlyDate Section

将根据公式计算每个 sectionID 的运行产品:

SectionDates

应用上述计算值后,将在Date | SecReturn | SectionTotal -----------|---------------|-------------------- 2015-04-01 | X (lets say) | (1+x)-1 2015-04-01 | Y | (1+x)(1+y)-1 2015-04-01 | Z | (1+x)(1+y)(1+z)-1 列中计算日期 2015-04-01 计算值将为(1 + 0.00355)-1 。同样,对于日期 2015-04-02 ,计算值将为(1 + 0.00355)(1 + -0.00578)-1 ,日期 2015-04- 03 计算值为(1 + 0.00355)(1 + -0.00578)(1 + 0.00788)-1 ,依此类推。

最终输出:

SectionTotal

1 个答案:

答案 0 :(得分:0)

您可以尝试以下查询:

string myString = "Hello world";
string[] mySplitString = myString.Split(' ');

string[] myArray = new string[3];
var loopLength = Math.min(mySplitString.length,myArray.length);

for(int i = 0; i < loopLength; i++){
    myArray[i] = mySplitString[i];
}
SQL Server 2005 AFAIK中提供的

SELECT SecID, [Date], [SecReturn], ROUND((1 + SecReturn) * COALESCE(v,1) - 1, 5) AS SectionTotal FROM mytable AS t1 OUTER APPLY ( SELECT EXP(SUM(LOG(SecReturn + 1))) AS v FROM mytable AS t2 WHERE t1.SecID = t2.SecID AND t1.[Date] > t2.[Date]) AS t3 获取在运行乘法计算时要考虑的所有记录。

使用this post中的乘法聚合公式,您可以获得所需的结果。

Demo here