2012-04-14 53 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'? – 2012-04-14 08:05:16

+0

對不起。錯字。現在更新預期結果。 – Vivasaayi 2012-04-14 08:08:51

回答

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