2

我有一个带有一系列 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

但是我遇到的问题是在第一个空年份之后,它仍然将以前的 yearly_pricing 识别为空,这给了我空结果,所以显然这种方法对我不起作用。还有其他改进建议吗?

谢谢

4

2 回答 2

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 小提琴演示

于 2013-10-17T17:32:28.973 回答
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 Fiddle,它显示了它是如何工作的:http ://sqlfiddle.com/#!3/296a4/21

于 2013-10-17T17:07:20.683 回答