根据数据类型将列拆分为行
Split columns into rows based on data type
我有一个table这样的
parent_id col1 col2 col3
101 John 1 9/12/2009 4:33:22 PM
102 Fid 2 2/10/2005 12:54:01 PM
103 Smith 3 6/4/2005 10:10:11 PM
col1 是 char
col2 是整数
col1 是时间戳
并且想在第一个 table 的基础上创建第二个 table,示例输出如下
parent_id ColName Charvalue IntValue TimeValue
101 Col1 John null null
101 Col1 Fid null null
101 Col1 Smith null null
102 Col2 null 1 null
102 Col2 null 2 null
102 Col2 null 3 null
103 Col3 null null 9/12/2009 4:33:22 PM
103 Col3 null null 2/10/2005 12:54:01 PM
103 Col3 null null 6/4/2005 10:10:11 PM
我应该在 MS SQL 服务器中使用 unpivot 来实现吗?
您可以尝试使用 UNION ALL
而不是 unpivot
SELECT 101 parent_id ,col1,NULL col2,NULL col3
FROM T
UNION ALL
SELECT 102,NULL,col2 ,NULL
FROM T
UNION ALL
SELECT 103,NULL ,NULL,col3
FROM T
您可以使用 CROSS APPLY (VALUES
进行逆轴旋转,这只需要扫描一次基数 table,因此非常高效
SELECT
t.parentid,
v.ColName,
v.Charvalue,
v.IntValue,
v.TimeValue
FROM YourTable t
CROSS APPLY (VALUES
('col1', t.col1, NULL, NULL),
('col2', NULL, t.col2, NULL),
('col3', NULL, NULL, t.col3)
) v(ColName, Charvalue, IntValue, TimeValue);
我有一个table这样的
parent_id col1 col2 col3
101 John 1 9/12/2009 4:33:22 PM
102 Fid 2 2/10/2005 12:54:01 PM
103 Smith 3 6/4/2005 10:10:11 PM
col1 是 char
col2 是整数
col1 是时间戳
并且想在第一个 table 的基础上创建第二个 table,示例输出如下
parent_id ColName Charvalue IntValue TimeValue
101 Col1 John null null
101 Col1 Fid null null
101 Col1 Smith null null
102 Col2 null 1 null
102 Col2 null 2 null
102 Col2 null 3 null
103 Col3 null null 9/12/2009 4:33:22 PM
103 Col3 null null 2/10/2005 12:54:01 PM
103 Col3 null null 6/4/2005 10:10:11 PM
我应该在 MS SQL 服务器中使用 unpivot 来实现吗?
您可以尝试使用 UNION ALL
而不是 unpivot
SELECT 101 parent_id ,col1,NULL col2,NULL col3
FROM T
UNION ALL
SELECT 102,NULL,col2 ,NULL
FROM T
UNION ALL
SELECT 103,NULL ,NULL,col3
FROM T
您可以使用 CROSS APPLY (VALUES
进行逆轴旋转,这只需要扫描一次基数 table,因此非常高效
SELECT
t.parentid,
v.ColName,
v.Charvalue,
v.IntValue,
v.TimeValue
FROM YourTable t
CROSS APPLY (VALUES
('col1', t.col1, NULL, NULL),
('col2', NULL, t.col2, NULL),
('col3', NULL, NULL, t.col3)
) v(ColName, Charvalue, IntValue, TimeValue);