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 表列的主要内容,如果未能解决你的问题,请参考以下文章