以前的领域增加2.5%?

时间:2013-10-17 16:15:50

标签: sql sql-server

我有一个包含一系列ID的表格。每个ID的日期从当前年度到2025年。每个ID每年都有特定的价格。

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识别为null,这给了我null结果,所以显然这个方法对我不起作用。还有其他改进建议吗?

由于

2 个答案:

答案 0 :(得分: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 :(得分: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