UNPIVOT Table 列
UNPIVOT Table Columns
我想以行而不是列的形式获取我的 table 数据。
也动态读取列名。
视觉示例:
ColA ColB ColC ColD
1 2 3 4
为此:
ColA 1
ColB 2
ColC 3
ColD 4
我的首选方法是 apply
:
select v.*
from t cross apply
(values ('colA', t.colA), ('colB', t.colb), ('colC', t.colc), ('colD', t.cold)
) v(which, val);
从技术上讲,apply
实现了 横向连接 。这是非常强大的; unpivot
只是它可以完成的众多事情之一。但是,unpivot
是开始学习 apply
的好方法。
这种方法将“动态地”逆透视您的数据,而无需实际使用动态 SQL 或指定所有字段名称。
完全披露: Gordon 的方法当然更高效。
例子
Select C.*
From YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Item = a.value('local-name(.)','varchar(100)')
,Value = a.value('.','varchar(max)')
From B.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./@*') as C2(a)
Where a.value('local-name(.)','varchar(100)') not in ('Colums','To_Exclude')
) C
Returns
Item Value
ColA 1
ColB 2
ColC 3
ColD 4
我想以行而不是列的形式获取我的 table 数据。
也动态读取列名。
视觉示例:
ColA ColB ColC ColD
1 2 3 4
为此:
ColA 1
ColB 2
ColC 3
ColD 4
我的首选方法是 apply
:
select v.*
from t cross apply
(values ('colA', t.colA), ('colB', t.colb), ('colC', t.colc), ('colD', t.cold)
) v(which, val);
从技术上讲,apply
实现了 横向连接 。这是非常强大的; unpivot
只是它可以完成的众多事情之一。但是,unpivot
是开始学习 apply
的好方法。
这种方法将“动态地”逆透视您的数据,而无需实际使用动态 SQL 或指定所有字段名称。
完全披露: Gordon 的方法当然更高效。
例子
Select C.*
From YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Item = a.value('local-name(.)','varchar(100)')
,Value = a.value('.','varchar(max)')
From B.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./@*') as C2(a)
Where a.value('local-name(.)','varchar(100)') not in ('Colums','To_Exclude')
) C
Returns
Item Value
ColA 1
ColB 2
ColC 3
ColD 4