いくつかのレコードを更新する必要があります ここにテーブル構造があります
テーブル A は、いくつかのレコード A(Id,DataYear0,DataYear1,DataYear3) を更新するために必要なメインのテーブルです。
テーブル B には、B(Id,Year,DataYear) が必要なデータ以外のデータがあります。
表 B のデータ例: B(abc,1950,1.25) B(abc,1951,1.29) .. .. B(abc,2008,1.67) B(abc,2009,1.23) B(abc,2010,1.52) B(abc,2011,1.78) B(abc,2012,NULL)
2012 年を現在の年として、表 A の過去 3 年間 (つまり、2011 年、2010 年、2009 年) のデータ値を更新する必要があります。
したがって、上記の例では、テーブル A を A(abc,1.78,1.52,1.23) として更新する必要があります。同様に、他のレコードも更新する必要があります。
Id は両方のテーブルの主キーです。
私がこれまでに持っているクエリは
UPDATE A SET
DataYear0 = CASE WHEN Year+1 = YEAR(GETDATE()) THEN DataYear END,
DataYear1 = CASE WHEN Year+2 = YEAR(GETDATE()) THEN DataYear END,
DataYear2 = CASE WHEN Year+3 = YEAR(GETDATE()) THEN DataYear END
FROM A
LEFT JOIN B
ON A.Id=B.Id
これは機能しませんでした。これは、必要な年とは別に余分な年のレコードを返していると思うためです。つまり、過去 3 年だけです。
UPDATE A SET
DataYear0 = CASE WHEN Year+1 = YEAR(GETDATE()) THEN DataYear END,
DataYear1 = CASE WHEN Year+2 = YEAR(GETDATE()) THEN DataYear END,
DataYear2 = CASE WHEN Year+3 = YEAR(GETDATE()) THEN DataYear END
FROM A
LEFT JOIN B
ON A.Id=B.Id
GROUP BY Id,Year,DataYear
HAVING ((YEAR(GETDATE())-3) <= Year) AND (Year <> YEAR(GETDATE()))
しかし、まだデータは更新されていません。
CTEを使ってみた
;WITH cte AS
(
SELECT
A.Id
,B.Year
,B.DataYear
,ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Year DESC) as row
FROM A
LEFT JOIN B
ON A.Id=B.Id
GROUP BY Id,Year,DataYear
HAVING ((YEAR(GETDATE())-3) <= Year) AND (Year <> YEAR(GETDATE()))
)
UPDATE
A.DataYear0 = CASE WHEN row=1 THEN DataYear END
,A.DataYear1 = CASE WHEN row=2 THEN DataYear END
,A.DataYear2 = CASE WHEN row=3 THEN DataYear END
FROM A
LEFT JOIN cte
ON A.Id = cte.Id
データはまだ更新されていません。どなたでもご提案いただければ幸いです。よろしくお願いします。