2016-03-01 89 views
4

我有2列以下的表格,日期&因子。我想計算累積產品,就像SQL Server 2008中的CUMFACTOR一樣。如何計算SQL Server 2008中的累積產品?

有人可以給我建議一些選擇。 enter image description here

+0

你的數據中是否有ROW列? – Jodrell

+0

[相關問題](http://stackoverflow.com/q/3912204/521799) –

回答

1

不幸的是,在SQL Server(或其他大多數SQL數據庫)中沒有PROD()聚合或窗口函數。但是你可以模仿它是這樣:

SELECT Date, Factor, exp(sum(log(Factor)) OVER (ORDER BY Date)) CumFactor 
FROM MyTable 
+0

你好Lukas,謝謝你的快速回復。目前我在SQL Server 2008中,不幸的是LEAD和LAG函數在這個版本中不可用。那麼還有其他的選擇? – Prav

+1

@Lukas Eder:兩種解決方案都不匹配OP的CumFactor列中的值。 – knot22

+0

@ knot22:恩,謝謝你的提示。這個問題在我的答案被接受後2天進行了編輯:(將解決我的答案 –

1

你可以做到這一點:

SELECT A.ROW 
    , A.DATE 
    , A.RATE 
    , A.RATE * B.RATE AS [CUM RATE] 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY DATE) as ROW, DATE, RATE 
    FROM TABLE 
) A 
LEFT JOIN (
    SELECT ROW_NUMBER() OVER(ORDER BY DATE) as ROW, DATE, RATE 
    FROM TABLE 
) B 
ON A.ROW + 1 = B.ROW 
+0

在2005年版本中引入了「LEAD/LAG」,同時在2005年進行了排名功能。 –

1

計算累積的產品,如在原崗位顯示在CumFactor列,下面的代碼做這項工作:

--first, load the sample data to a temp table 
select * 
into #t 
from 
(
    values 
    ('2/3/2000', 10), 
    ('2/4/2000', 20), 
    ('2/5/2000', 30), 
    ('2/6/2000', 40) 
) d ([Date], [Rate]); 

--next, calculate cumulative product 
select *, CumFactor = cast(exp(sum(log([Rate])) over (order by [Date])) as int) from #t; 

下面是結果:
enter image description here