Sql server 将表列转换为行

Sql server 将表列转换为行,sql-server,tsql,Sql Server,Tsql,我有一个SQL Server表,我想在其中将列转换为行(从宽到高) 当前表格格式: 所需表格格式: 我已经研究了一个方法调用透视/取消透视,但我似乎无法按照我需要的方式获得格式。谢谢你的帮助 UnPivot当然性能更好,但是这里有一种方法可以动态地UnPivot几乎任何表、查询或记录,而不实际使用动态SQL 示例 Declare @YourTable Table (Date date,cost1 int,cost2 int,cost3 int) Insert Into @YourTable

我有一个SQL Server表,我想在其中将列转换为行(从宽到高)

当前表格格式:

所需表格格式:


我已经研究了一个方法调用透视/取消透视,但我似乎无法按照我需要的方式获得格式。谢谢你的帮助

UnPivot当然性能更好,但是这里有一种方法可以动态地UnPivot几乎任何表、查询或记录,而不实际使用动态SQL

示例

Declare @YourTable Table (Date date,cost1 int,cost2 int,cost3 int)
Insert Into @YourTable Values 
 ('6/30/2017',3,4,5),
 ('6/24/2017',3,4,5),
 ('6/22/2017',3,4,5)

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 ('Column1','Column2')
             ) C
返回

Item    Value
Date    2017-06-30
cost1   3
cost2   4
cost3   5
Date    2017-06-24
cost1   3
cost2   4
cost3   5
Date    2017-06-22
cost1   3
cost2   4
cost3   5
Date        Item    Value
2017-06-30  cost1   3
2017-06-30  cost2   4
2017-06-30  cost3   5
2017-06-24  cost1   3
2017-06-24  cost2   4
2017-06-24  cost3   5
2017-06-22  cost1   3
2017-06-22  cost2   4
2017-06-22  cost3   5
现在,稍微扭转一下

Select A.Date
      ,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 ('Date','Column2')
             ) C
返回

Item    Value
Date    2017-06-30
cost1   3
cost2   4
cost3   5
Date    2017-06-24
cost1   3
cost2   4
cost3   5
Date    2017-06-22
cost1   3
cost2   4
cost3   5
Date        Item    Value
2017-06-30  cost1   3
2017-06-30  cost2   4
2017-06-30  cost3   5
2017-06-24  cost1   3
2017-06-24  cost2   4
2017-06-24  cost3   5
2017-06-22  cost1   3
2017-06-22  cost2   4
2017-06-22  cost3   5

您的意思是一个实际的表,还是您想要一个结果集?将日期和成本存储在同一列中是一个非常糟糕的主意抱歉,我需要将此结果集插入一个新表中。不只是您需要的格式,它到底有什么问题?