2013-10-17 28 views
2

我有一系列ID的表格。每個ID的日期從今年起到2025年不等。每個ID每年都有一個特定的價格。前一場增長2.5%?

http://i.imgur.com/srplSDo.jpg

一旦我得到某一點,每個ID,它不再有具體的價格。所以我想要做的是拿去年的價格,並增加2.5%。我已經想通了一種搶前幾年的價格與此

SELECT a.*, 
     (CASE 
     WHEN a.YEARLY_PRICING is not null 
     THEN a.YEARLY_PRICING 
     ELSE (SELECT b.YEARLY_PRICING 
       FROM #STEP3 b 
       WHERE (a.id = b.id) AND (b.YEAR = a.YEAR-1))*1.025 
     END) AS TEST 
FROM #STEP3 a 

這將提供以下結果:

http://imgur.com/MJutM99

但我遇到的問題是第一個空一年後,它是仍然認識到之前的annual_pricing爲空,這給了我空結果,所以顯然這種方法不適合我。任何其他改進建議?

感謝

+1

這是一個時間查詢或東西,將不斷地運行?換句話說,你只是試圖按摩數據一次?如果一次,只需使用光標。 – NotMe

+0

該查詢包含一系列查詢,其中根數據在整年中始終保持不變。我對遊標不太熟悉,所以我會看看這是否可行。 – Hallel86

回答

0

你需要的是找到一個不只是方式上一年度(年 - 1),而是當年那是以前的,也有非空的價格。要查詢等一年(不解決您的問題),你會做這樣的事情:

select a.* 
, (select max(year) 
    from step3 b 
    where a.id=b.id and a.year>b.year and b.yearly_pricing is not null 
) PRIOR_YEAR 
from step3 a 

由於SQL-Server允許公用表表達式,可以撥打上面的查詢「TMP」,然後途徑就這樣。任何年份的CALC_PRICE都是根據上述查詢找到的「PRIOR_YEAR」中的價格乘以係數。對於從「PRIOR_YEAR」到今年的年數的POWER來說,該因數將是1.025。

你最終會得到這樣的SQL:

with TMP AS (
select a.* 
, (select max(year) 
    from step3 b 
    where a.id=b.id and a.year>b.year and b.yearly_pricing is not null 
) PRIOR_YEAR 
from step3 a 
) 
select t.*, 
    c.yearly_pricing As prior_price, 
    c.yearly_pricing * POWER(1.025 , (t.year-t.prior_year)) calc_price 
from tmp t 
left join step3 c 
on t.id=c.id and t.prior_year = c.year 

它仍然有空值等,但這些都是很容易與COALESCE()處理或像你這樣的CASE表達式有你的問題。

下面是一個SQL小提琴這說明它是如何工作:http://sqlfiddle.com/#!3/296a4/21

+1

你缺少'和t.id = c.id'。 –

+0

謝謝。這就是測試數據只有一個id時會發生的情況:) –

0
WITH CTE AS 
(
SELECT ID, Year, Price, Price AS Prev 
    FROM T A 
    WHERE Year = (SELECT min(year) FROM T WHERE T.ID = A.ID GROUP BY T.ID) 
UNION ALL 
SELECT T.ID, T.Year, T.Price, ISNULL(T.Price, 1.025*Prev) 
    FROM T JOIN CTE ON T.ID = CTE.ID 
    AND T.Year - 1 = CTE.YEAR 
) 

SELECT * FROM CTE 
ORDER BY ID, Year 

SQL Fiddle Demo