2012-04-14 2 views
2

SQLサーバーの行を次のようにマージしたいとします。次のようにSQLで行をマージする

PK F1  F2  F3  Order 
A NULL NULL Grapes 2 
B NULL Fig  NULL 1 
C Apple Orange Banana 0 

入力と期待される結果です。

Input  Expected Result  
2  Apple Fig Grapes 
1  Apple Fig Banana 
0  Apple Orange Banana 

SQLストアドプロシージャでこれを行うにはどうすればよいですか?私はコード以外のSqlで行うことを好む。私はこのような何か多分右、その後あなたの入力を理解していればアドバンス

+2

この「マージ」の後ろの**論理**とは何ですか? 'Input = 0'の行が' Apple Orange Banana'を読み込むのはなぜですか? –

+0

申し訳ありません。打ち間違え。今すぐ期待された結果を更新しました。 – Vivasaayi

答えて

3

ありがとう:

テストデータ

DECLARE @T TABLE 
(
    PK VARCHAR(5), 
    F1 VARCHAR(10), 
    F2 VARCHAR(10), 
    F3 VARCHAR(10), 
    [Order] INT 
) 

INSERT INTO @T 
VALUES 
    ('A',NULL,NULL,'Grapes',2), 
    ('B',NULL,'Fig',NULL,1), 
    ('C','Apple','Orange','Banana',0) 

クエリ

;WITH CTE 
AS 
( 
    SELECT 
     ROW_NUMBER() OVER(ORDER BY [Order]) AS RowNbr, 
     T.* 
    FROM 
     @T AS T 
) 
, CTE2 
AS 
(
    SELECT 
     CTE.RowNbr, 
     CTE.PK, 
     CTE.F1, 
     CTE.F2, 
     CTE.F3, 
     CTE.[Order] 
    FROM 
     CTE 
    WHERE 
     CTE.RowNbr=1 
    UNION ALL 
    SELECT 
     CTE.RowNbr, 
     CTE.PK, 
     ISNULL(CTE.F1,CTE2.F1), 
     ISNULL(CTE.F2,CTE2.F2), 
     ISNULL(CTE.F3,CTE2.F3), 
     CTE.[Order] 
    FROM 
     CTE 
     JOIN CTE2 ON CTE.RowNbr=CTE2.RowNbr+1 

) 
SELECT 
    CTE2.[Order],CTE2.F1,CTE2.F2,CTE2.F3 
FROM 
    CTE2 
ORDER BY 
    CTE2.RowNbr DESC 

結果

2 Apple Fig  Grapes 
1 Apple Fig  Banana 
0 Apple Orange Banana 
関連する問題