我有一个包含一系列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
会提供以下结果:
但我遇到的问题是在第一个空年之后,它仍然将之前的annual_pricing识别为null,这给了我null结果,所以显然这个方法对我不起作用。还有其他改进建议吗?
由于
答案 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 强>