SSIS Unpivot 包括列名
SSIS Unpivot including column names
(在 SQL Server 2008 上出价)
我有一个平面文件(竖线分隔),我已成功将其解析为以下格式:
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 公式以编程方式获取列名,我想也许我可以在派生列中生成列名,然后合并将两者连接在一起...但这似乎不是一种非常有效的方法,而且我无论如何也无法让它发挥作用。我已经尝试将派生列设置为 return 硬代码中的列名(例如,使用 "FreeText1" 作为公式),但是我仍然不确定如何将其与 Unpivoted 结果结合起来。
如有任何意见,我们将不胜感激!
我发现对于某些人来说,UnPivot 学习起来比它的价值更令人困惑,所以我总是尽可能避免使用它。如果你想采取不同的方法,你可以这样做:
将数据加载到临时 table 并 运行 对其进行以下查询:
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
您可以使用 UNPIVOT 转换,它应该类似于
或者您可以将数据加载到分段 table 并使用 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
along with a 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);
(在 SQL Server 2008 上出价)
我有一个平面文件(竖线分隔),我已成功将其解析为以下格式:
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 公式以编程方式获取列名,我想也许我可以在派生列中生成列名,然后合并将两者连接在一起...但这似乎不是一种非常有效的方法,而且我无论如何也无法让它发挥作用。我已经尝试将派生列设置为 return 硬代码中的列名(例如,使用 "FreeText1" 作为公式),但是我仍然不确定如何将其与 Unpivoted 结果结合起来。
如有任何意见,我们将不胜感激!
我发现对于某些人来说,UnPivot 学习起来比它的价值更令人困惑,所以我总是尽可能避免使用它。如果你想采取不同的方法,你可以这样做:
将数据加载到临时 table 并 运行 对其进行以下查询:
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
您可以使用 UNPIVOT 转换,它应该类似于
或者您可以将数据加载到分段 table 并使用 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
along with a 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);