代码之家  ›  专栏  ›  技术社区  ›  Brondahl

如何将展开的SQL表转换为行(近似取消填充)

  •  2
  • Brondahl  · 技术社区  · 8 年前

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

    和目标表模式:

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

    Table1 由中的1行表示 TableA 和2行 TableB X ,另一个类型为 Y )



    表1 进入 (显然 表A 很容易。)

    我知道如何使用 UNION ALL ,但这将是丑陋的。(尤其是因为 (X,Y) 实际上是 (P,Q,R,S,T,U,V,W,X,Y,Z) 1 ... 3 1 ... 15 . 叹息)

    我觉得 PIVOT UNPIVOT 有点接近,但我看不到任何具体的处理方法-我总是看到一些只移动单列或单列集的东西。

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Pரதீப்    8 年前

    你在找这个

    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 
    

    ValueX1 ValueY1 隐式可转换或相同。剩下的一对也一样