2013-10-17 31 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