如何将扁平的 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
注意这两种方法都认为,ValueX1
和 ValueY1
的数据类型可以隐式转换或相同。其余对也是如此
想象一下来源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
注意这两种方法都认为,ValueX1
和 ValueY1
的数据类型可以隐式转换或相同。其余对也是如此