2012-05-24 22 views
1

是否可以在沒有逐行處理的情況下在SQL Server 2005中執行以下操作?如果是這樣,怎麼樣? :)無需逐行處理即可轉置或轉置SQL Server 2005表數據

我的表是這樣的:

╔════════════╦═══════════╦════════════╗ 
║ CustomerID ║ FirstName ║ LastName ║ 
╠════════════╬═══════════╬════════════╣ 
║   1 ║ George ║ Washington ║ 
║   2 ║ Benjamin ║ Franklin ║ 
║   3 ║ Thomas ║ Jefferson ║ 
╚════════════╩═══════════╩════════════╝ 

我到輸出上表所示:

╔════════════╦══════════╦════════════╗ 
║ Field ║ IntValue ║ TextValue ║ 
╠════════════╬══════════╬════════════╣ 
║ CustomerID ║ 1  ║ NULL  ║ 
║ FirstName ║ NULL  ║ George  ║ 
║ LastName ║ NULL  ║ Washington ║ 
║ CustomerID ║ 2  ║ NULL  ║ 
║ FirstName ║ NULL  ║ Benjamin ║ 
║ LastName ║ NULL  ║ Franklin ║ 
║ CustomerID ║ 3  ║ NULL  ║ 
║ FirstName ║ NULL  ║ Thomas  ║ 
║ LastName ║ NULL  ║ Jefferson ║ 
╚════════════╩══════════╩════════════╝ 

謝謝! Jason

+1

爲什麼這個換位必須在SQL Server中完成?這對於表示層(它必須遍歷行以呈現它們)似乎更合適。 –

+0

我沒有說這必須在SQL Server中完成。如果需要的話,我可以創建一個C#應用程序或者做一個基於循環的循環,並逐行排除它。我開始做越來越多的dba工作,並被要求做一些一次性選擇。所以我想知道是否有替代上述請求的逐行處理。 – programmer

+0

選擇被消費在哪裏? –

回答

1

這隻能掃描一次表(從@亞倫的答案借用表變量)。

SELECT Field, 
     IntValue, 
     TextValue 
FROM @x 
     CROSS APPLY (SELECT 'CustomerID', CustomerID, NULL 
        UNION ALL 
        SELECT 'FirstName', NULL, FirstName 
        UNION ALL 
        SELECT 'LastName', NULL, LastName) 
     CA(Field, IntValue, TextValue) 
ORDER BY CustomerID 
2

雖然我仍然認爲這個pivoting在SELECT層消耗的層上執行得更好,但這裏有一個想法。

DECLARE @x TABLE(CustomerID INT, FirstName VARCHAR(32), LastName NVARCHAR(32)); 

INSERT @x SELECT 1, 'George', 'Washington' 
UNION ALL SELECT 2, 'Benjamin', 'Franklin' 
UNION ALL SELECT 3, 'Thomas', 'Jefferson'; 

;WITH x AS 
(
    SELECT 
    Field = 'CustomerID', IntValue = CustomerID, TextValue = NULL, 
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID) 
    FROM @x 
    UNION ALL 
    SELECT 
    Field = 'FirstName', NULL, FirstName, 
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID) 
    FROM @x 
    UNION ALL 
    SELECT 
    Field = 'LastName', NULL, LastName, 
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID) 
    FROM @x 
) 
SELECT Field, IntValue, TextValue 
FROM x 
ORDER BY rn, Field; 

爲什麼稍後在演示文稿中做得更好?因爲這個「解決方案」將三次掃描表格。而消費者仍然將不得不使用循環來顯示結果...