首页 > 解决方案 > 转置和扩展列数据集 T-SQL

问题描述

我有一个 SQL 表,它类似于我在 excel 中创建的以下示例: 样本数据集


以下是我想要的结果。我需要将上面的数据转换成一个 2 列的列表:

期望的结果


以防万一需要更多信息,这里是第一张图片,并附有说明我为什么使用我拥有的行的注释: 输入表+注释

标签: sqlsql-serverdatabasetsqltranspose

解决方案


UnPivot 的性能当然更高,但如果您想在不实际使用 Dynamic SQL 的情况下动态取消数据透视,请考虑以下事项

例子

Select A.fruiteater
      ,C.*
 From  fruits 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 ('fruiteater','OtherColumnsToExclude')
             ) C

退货

fruiteater  Item    Value
Aaron       Fruit1  Orange
Aaron       Fruit2  Pear
Aaron       Fruit3  Apple
Bob         Fruit1  Apple
Bob         Fruit2  Orange
Bob         Fruit3  Blueberries
Bob         Fruit4  Peach
Bob         Fruit5  Mango
Bob         Fruit6  Banana
Carter      Fruit1  Pear
Carter      Fruit2  Orange
Carter      Fruit3  Apple
David       Fruit1  Blueberries
Earnest     Fruit1  Mango
Earnest     Fruit2  Orange
Earnest     Fruit3  Pear
Earnest     Fruit4  Apple
Earnest     Fruit5  Blueberries
Frank       Fruit1  Raspberries

推荐阅读