2017-11-30 5 views
0

これは私を少しナットにしています。私は私の問題の簡略版を説明します。TSQL複数の列をCASEで更新しますが、値に応じて

CREATE TABLE AMG_TDest(
ID INT, 
Value1 INT, 
Value2 INT, 
Value3 INT, 
Value4 INT) 

CREATE TABLE AMG_TSource(
ID INT, 
RowNumber INT, 
Value INT) 

INSERT INTO AMG_TDest VALUES (1, 0, 0, 0, 0), (2, 0, 0, 0, 0) 

INSERT INTO AMG_TSource VALUES (1, 1, 1), (1, 2, 2), (1, 3, 3), (1, 4, 4), (2, 1, 10), (2, 2, 20), (2, 3, 30), (2, 4, 40) 

私はTSource.RowNumberに応じて、送信先テーブルに値1、値2、値3とValue4を更新したい:私は2つのテーブル、送信元と送信先を持っています。私は、結果として手に入れたいものを最後に

は、送信先テーブルの上にこのです:

ID V1 V2 V3 V4 
1 1 2 3 4 
2 10 20 30 40 

私は(いくつかのバリエーションで)これを試してみました

UPDATE AMG_TDest 
SET 
    Value1 = CASE WHEN S.RowNumber = 1 THEN COALESCE(S.Value, 0) ELSE Value1 END, 
    Value2 = CASE WHEN S.RowNumber = 2 THEN COALESCE(S.Value, 0) ELSE Value2 END, 
    Value3 = CASE WHEN S.RowNumber = 3 THEN COALESCE(S.Value, 0) ELSE Value3 END, 
    Value4 = CASE WHEN S.RowNumber = 4 THEN COALESCE(S.Value, 0) ELSE Value4 END 
FROM (SELECT * FROM AMG_TSource) AS S 
INNER JOIN AMG_TDest D ON D.ID = S.ID 

それはちょうど最初から値1を更新最後の行から値4を返します。私はこれで何時間も戦ってきました。私はそれを動作させることはできません。誰かが提案を持っているなら、私は本当に感謝しています。ここで

答えて

0

はピボットがそう

ID Value4 Value3 Value2 Value1 
1 4  3  2  1 
2 40  30  20  10 

のようなソースデータセットが次にあなたがあるために必要なのは、その後の更新のためにID列 に参加chamges PIVOTを使用する方法

;WITH cteX 
AS(
    SELECT PVT.ID 
     , PVT.Value4 
     , PVT.Value3 
     , PVT.Value2 
     , PVT.Value1 
    FROM 
    (
     SELECT S.ID 
      , RN ='Value' + CAST(S.RowNumber AS varchar(10)) 
      , S.[Value] 
     FROM dbo.AMG_TSource S 
    ) X 
    PIVOT 
    (
     MAX(Value) FOR RN IN ([Value1],[Value2],[Value3],[Value4]) 
    ) PVT 
) 
UPDATE D 
SET D.Value1 = X.Value1 
    , D.Value2 = X.Value2 
    , D.Value3 = X.Value3 
    , D.Value4 = X.Value4 
FROM 
    dbo.AMG_TDest D 
INNER JOIN 
    cteX   X ON X.ID = D.ID 

です目的地テーブル

+0

素晴らしい!できます。元のUSPで確認して、パフォーマンス上の問題があるかどうかを確認します。私は多くの列を持っており、それは少しキロメートルです –

+0

私は助けて嬉しいです –

関連する問題