2016-07-28 87 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