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

しかし、私が抱えている問題は、最初のnull年の後です。以前の yearly_pricing をnullとして認識しているため、nullの結果が得られるため、明らかにこの方法は機能しません。改善のための他の提案はありますか?

ありがとう

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) だけでなく、前の年で価格が null でない年を検索する方法です。そのような年を (問題を解決せずに) 照会するには、次のようにします。

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」から現在の年までの年数の累乗の 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 に答える