【问题标题】:SSIS Unpivot including column namesSSIS Unpivot 包括列名
【发布时间】:2016-07-28 12:19:23
【问题描述】:

(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 公式,我想也许我可以在派生列中生成列名,然后将两者合并在一起......但是似乎不是一种非常有效的方法,无论如何我都无法使其工作。我尝试设置派生列以硬代码返回列名(例如,使用“FreeText1”作为公式),但是我仍然不确定如何将其与 Unpivoted 结果结合起来。

任何意见将不胜感激!

【问题讨论】:

    标签: sql-server-2008 ssis bids unpivot


    【解决方案1】:

    您可以使用 UNPIVOT 转换,它应该类似于

    或者您可以将数据加载到临时表并使用 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 APPLYtable 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);
    

    【讨论】:

      【解决方案2】:

      我发现对于某些人来说,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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 2020-01-06
        • 2021-12-30
        • 2018-03-23
        相关资源
        最近更新 更多