UNPIVOT表格列

时间:2018-04-22 18:48:33

标签: sql sql-server sql-server-2012 unpivot

我希望以行而不是列来获取表数据。

也动态读取列名。

视觉示例:

ColA    ColB    ColC    ColD
1       2       3       4

对此:

ColA    1
ColB    2
ColC    3
ColD    4

2 个答案:

答案 0 :(得分:1)

我首选的方法是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的好方法。

答案 1 :(得分:1)

此方法将“动态”取消您的数据,而无需实际使用动态SQL或指定所有字段名称。

完全披露:戈登的方法肯定更具性能。

示例

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

<强>返回

Item    Value
ColA    1
ColB    2
ColC    3
ColD    4