2011-10-13 44 views
0

這是一個很容易的問題,但是想知道是否有人可以提供更優雅的解決方案。隨着時間的推移調整日期列

我有一個表格,包括日期列(月末結束日期)和多個值列 - 說一段時間內各種股票的價格,每個股票一列。我想計算在日期列中表示的每個期間的價值欄的變化(例如,從填充了價格的表格中獲得的每日回報)。

我目前的計劃是加入表與自身簡單地創建了回報RET = b.price/a.price新列 - 1,代碼如下:

select Date, Ret = (b.stock1/a.stock1 - 1) 
from #temp a, #temp b 
where datediff(day, a.Date,b.Date) between 25 and 35 
order by a.Date 

這工作正常,但是:

(1)我需要爲數十種股票做這個工作 - 有沒有一種很好的方式來複制計算,而不需要複製和粘貼返回計算並用其他股票名稱替換'stock1' ?

(2)有沒有更好的方法來做這個連接?在這一點上,我實際上正在做一個交叉連接,只保留相鄰的條目(如由datediff和範圍定義),但是想知道是否有更好的方法將這樣的表連接到它本身。

編輯:每請求,數據的格式爲(我的數據有多個價格列雖然):

Date  Price 
7/1/1996 349.22 
7/31/1996 337.72 
8/30/1996 343.70 
9/30/1996 357.23 
10/31/1996 364.07 
11/29/1996 385.04 
12/31/1996 383.68 

,並從,我想計算回報,產生這樣的表(再次,與存在於實際的表的額外價格列的附加列):

Date  Ret 
7/31/1996 -0.03 
8/30/1996 0.02 
9/30/1996 0.04 
10/31/1996 0.02 
11/29/1996 0.06 
12/31/1996 0.00 
+0

什麼是你的表結構?您正在使用什麼版本的SQL Server? – Lamak

+0

表格結構如上所述:日期列和幾個價格/值列,我想從中計算變化/回報。 我正在使用SQL-Server 2008. – Chris

+0

@Chris:當我們說表結構時,我們的意思是一個create table或類似的東西。還有樣本數據:行和預期的輸出。就目前而言,沒有足夠的答案 – gbn

回答

0

我會做到以下幾點。首先,使用月份和年份進行自我加入。我建議您將年份* 12 +月份數字取爲每個月份和年份組合的唯一值。因此,2011年1月的價值爲(2011 * 12 + 1 = 24133),2010年12月的價值爲(2010 * 12 + 12 = 24132)。這將使您能夠精確地比較幾個月,而不必擔心從十二月到一月的滾動。接下來,您需要在select子句中提供計算。如果您的股票價格位於不同的欄目中,那麼您必須將其輸入爲.stock1-b.stock1,a.stock2-b.stock2等。唯一的方法是將數據按摩到那裏只是一個股票價值列,並添加一個股票名稱列,以確定該股票的價值。

使用年份和月份爲自連接,下面的查詢應該工作:

select Date, Ret = (b.stock1/a.stock1 - 1) 
    from #temp a 
inner join #temp b on (YEAR(a.Date) * 12) + MONTH(a.Date) = (YEAR(b.Date) * 12) + MONTH(b.Date) + 1 
order by a.Date 
相關問題