2016-05-16 62 views
0

示例模式:ID(VARCHAR 4),YM(VARCHAR 6),牧師(浮動),P_K(ID,YM)12個月滾動SUM從最新數據與VARCHAR YearMonth

ID  YM  Rev 
1001 201112 150 
1001 201211 200 
1001 201212 200 
1001 201303 500 
...  ...  ... 
1001 201605 400 
1023 201112 150 
1023 201211 200 
1023 201212 200 
1023 201303 500 
...  ...  ... 
1023 201605 700 

我需要創建一個VIEW,其中每行在YM(Year Month)之前的12個月前應該有Rev(Revenue)的SUM。

我已經嘗試了以下查詢,但它從「201512」向後返回數據。我期待YM從'201603'開始,因爲這是表中最新的YM數據。

SELECT 
    fs.ID, 
    fs.YM, 
    (SELECT SUM(fsi.Rev) FROM FSource fsi WHERE fsi.YM >= ((100* (fs.YM/100) + 1)-100) AND fsi.YM <= fs.YM AND fsi.ID= fs.ID) AS Rev 

FROM FSource fs 
WHERE RIGHT(fs.ym, 2) = (SELECT COUNT(*) FROM FSource fsi WHERE fsi.YM >= ((100* (fs.ym/100) + 1)-100) AND fsi.YM <= fs.ym AND fsi.ID= fs.ID)  

任何幫助,這裏有什麼可能是錯誤的發生?

預期輸出:

ID  YM  Rev 
...  ...  ... 
1001 201601 1500 
1001 201602 2400 
1001 201603 2400 
1001 201604 6000 
1001 201605 4800 (assuming last 12 months were 400 each, date range "201506 to 201605") 
+0

創建一個代表12個月的表格,在此表格上做左邊的加入,ISNULL(sum(yourstuff),0),group by和that應該是 – Veljko89

+0

提供所需的輸出。 –

+0

並用您正在使用的數據庫標記您的問題。 –

回答

2

爲此,可以使用相關子查詢的方法:

與查詢
select fs.*, 
     (select sum(fs2.rev) 
     from fsource fs2 
     where fs2.id = fs.id and 
       cast(fs2.ym as int) <= cast(fs.ym as int) and 
       cast(fs2.ym as int) > cast(fs.ym as int) - 100 
     ) as rev_12months 
from fsource fs; 

的一個問題是這樣的表達((100* (fs.YM/100) + 1)-100)。對於諸如201603的值,它將變成201501,因爲SQL Server會進行整數除法。另外,依靠隱式轉換是一個壞主意。

返回的行由外部where決定。我不知道該邏輯應該做什麼。

+0

你的解決方案無懈可擊。謝謝。沒有意識到它會那麼簡單。謝謝你的闡述。 – shaz