UNPIVOT 表列

Posted

技术标签:

【中文标题】UNPIVOT 表列【英文标题】:UNPIVOT Table Columns 【发布时间】:2018-04-22 18:48:33 【问题描述】:

我想以行而不是列的形式获取表格数据。

动态读取列名。

视觉示例:

ColA    ColB    ColC    ColD
1       2       3       4

到这里:

ColA    1
ColB    2
ColC    3
ColD    4

【问题讨论】:

【参考方案1】:

这种方法将“动态地”对您的数据进行反透视,而无需实际使用动态 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

退货

Item    Value
ColA    1
ColB    2
ColC    3
ColD    4

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于UNPIVOT 表列的主要内容,如果未能解决你的问题,请参考以下文章

Excel 2010 Unpivot 数据或利用 MySQL 进行 Unpivot

UNPIVOT 返回数据类型

将结果集从 UNPIVOT 插入到表中

聚合函数和 unpivot

PIVOT/UNPIVOT 多于一列

交叉应用与 UNPIVOT