2016-07-28 67 views
0

SSIS逆透視包括列名

我有一個平面文件(管道分隔),我已經成功地解析爲以下格式(SQL Server 2008上BIDS):

AccountID FreeText1 FreeText2 FreeText3 FreeText4 
1   Some text More text Other text Different Text 
2   Some text More text Other text Different Text 
3   Some text More text Other text Different Text 

我需要結束結果看起來是這樣的:

AccountID Title  TheData 
1   FreeText1 Some text 
1   FreeText2 More text 
1   FreeText3 Other text 
1   FreeText4 Different Text 
2   FreeText1 Some text 
2   FreeText2 More text 
2   Freetext3 Other text 
2   FreeText4 Different Text 
3   FreeText1 Some text 
3   FreeText2 More text 
3   FreeText3 Other text 
3   FreeText4 Different Text 

我對SSIS還是比較陌生,所以隨時學習。我在Unpivot轉換中找到的所有東西似乎都是我需要的,但我一直無法根據列的名稱(「FreeText1」等)找到如何將其轉換爲Unpivot,也沒有能力充分掌握如何設置Unpivot轉換,以便接近理想的結果。

我還沒有找到任何我可以在派生列中使用的SSIS公式來以編程方式獲得列名,也許我可以在派生列中生成列名,然後合併將兩者結合在一起......但這似乎不是一個非常有效的方法,我無法使其工作。我試圖設置派生列來返回硬代碼中的列名(例如,使用「FreeText1」作爲公式),但是我仍然不確定如何將其與Unpivoted結果結合使用。

任何輸入將不勝感激!

回答

1

你可以使用UNPIVOT轉型,這看起來應該像

enter image description here

或者你也可以將數據加載到一個臨時表,並使用TSQL UNPIVOT功能:

SELECT upvt.AccountID, upvt.Title, upvt.TheData 
FROM dbo.StagingTable AS t 
UNPIVOT (Title FOR TheData IN (FreeText1, FreeText2, FreeText3, FreeText4)) AS upvt; 

或稍微長一點,但更靈活的是使用CROSS APPLY以及table value constructor來反轉數據。例如

SELECT t.AccountID, upvt.Title, upvt.TheData 
FROM dbo.StagingTable AS t 
     CROSS APPLY 
     (VALUES 
      ('FreeText1', FreeText1), 
      ('FreeText2', FreeText2), 
      ('FreeText3', FreeText3), 
      ('FreeText4', FreeText4) 
     ) AS upvt (Title, TheData); 
+0

這工作完美!非常感謝你! – LegalEagle

0

我發現對於一些人來說,UnPivot比學習它更值得學習,所以我一直儘可能避免它。如果你想採取不同的方法,你可以這樣做:

將數據加載到一個臨時表,並針對它運行以下查詢:

Select * From 
    (
    Select AccountID, 'FreeText1' Title, FreeText1 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText2' Title, FreeText2 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText3' Title, FreeText3 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText4' Title, FreeText4 TheData From TableA 
    ) A 
Order By AccountID, Title