【问题标题】:How to convert flattened SQL Table to Rows (approximately UNPIVOTting)如何将扁平化的 SQL 表转换为行(大约 UNPIVOTting)
【发布时间】:2017-10-04 16:55:45
【问题描述】:

想象一下源表架构:

Table1: ID*, ValueA, ValueB, ValueX1, ValueX2, ValueX3, ValueY1, ValueY2, ValueY3

和目标表Schema:

TableA: ID*, ValueA, ValueB
TableB: ID*, Type*, Value1, Value2, Value3

Table1 中的单行由 TableA 中的 1 行和 TableB 中的 2 行表示(一个为 X,另一个为 Y


是的,前一个模式的存在让我很难过。不,不是我写的。不,我不能直接改变它。 :(


我想纠正一个查询以将Table1 转换为TableB(显然,得到TableA 很容易。)

我知道如何使用UNION ALL 来做到这一点,但这会很难看。 (尤其是因为(X,Y) 实际上是(P,Q,R,S,T,U,V,W,X,Y,Z),而1 ... 3 实际上是1 ... 15。叹息)

我觉得PIVOT/UNPIVOT 有点模糊,但我看不到任何专门处理这个问题的东西 - 我总是看到一些只移动单列或单列组的东西。

在任何意义上,这可以在 T-SQL 中优雅地完成吗?

【问题讨论】:

    标签: sql-server tsql pivot unpivot flatten


    【解决方案1】:

    你正在寻找这个

    Cross Apply 方法:(首选)

    SELECT ID, tc.Type, tc.Value1, tc.Value2, tc.Value3
    FROM   yourtable
            CROSS apply (VALUES (ValueX1,ValueX2,ValueX3,'X'),
                                (ValueY1,ValueY2,ValueY3,'Y') )tc (Value1, Value2, Value3, Type) 
    

    UNION ALL方法

    SELECT ID,type = 'X',ValueX1,ValueX2,ValueX3
    FROM   yourtable
    UNION ALL
    SELECT ID,'Y', ValueY1,ValueY2,ValueY3
    FROM   yourtable 
    

    请注意,这两种方法都认为ValueX1ValueY1 的数据类型可以隐式转换或相同。其余对也一样

    【讨论】:

    • 完美!非常感谢。是的,DataTypes 的一致性是一项要求。 (他说,意识到他实际上并没有检查它是真的,并且对原始模式的设计者没有信心)
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2011-02-10
    • 2018-08-27
    • 2017-02-13
    • 2012-03-17
    相关资源
    最近更新 更多