如何将扁平的 SQL Table 转换为行(大约 UNPIVOTting)

How to convert flattened SQL Table to Rows (approximately UNPIVOTting)

想象一下来源table架构:

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

和目标 table 模式:

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

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


是啊,以前schema的存在让我很难过。不,不是我写的。不,我不能直接改变它。 :(


我想要正确的查询将 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 中优雅地完成吗?

您正在寻找这个

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 的数据类型可以隐式转换或相同。其余对也是如此