2017-11-30 10 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, 값, VALUE3 및 VALUE4를 업데이트합니다. 결국

내가 무엇을 결과로 얻을 싶은 것은이 대상 테이블에 :
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

여기

;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 

피벗는 그런 다음에 업데이트에 대한 ID 열 에 가입 한 후입니다 위해 필요한 모든 그래서

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

같은 소스 데이터 집합을 chamges 피벗을 사용하는 방법입니다 대상 테이블

+0

좋아요! 그것은 작동합니다. 원래의 USP에서 성능 문제가 있는지 확인하겠습니다. 나는 많은 기둥을 가지고 있고 그것은 조금 킬로미터이다. –

+0

나는 기쁘게 도와 준다. –