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