Sql server TSQL-取消Pivot多列

Sql server TSQL-取消Pivot多列,sql-server,tsql,pivot,crosstab,unpivot,Sql Server,Tsql,Pivot,Crosstab,Unpivot,如何取消“一”中的多个列 现在我有一个unpivot用于每个列,但这会创建很多空行 请看截图。 在顶部可以看到输入数据。此刻我在中间的桌子上用这个代码: SELECT [ID], [RowNumber], [Year], [Sales] FROM ( SELECT ID, RowNumber, [Sales 2013] as [2013], [Sales 2014] as [2014] FROM mytable) p UNPIVOT (

如何取消“一”中的多个列

现在我有一个unpivot用于每个列,但这会创建很多空行

请看截图。

在顶部可以看到输入数据。此刻我在中间的桌子上用这个代码:

SELECT [ID], [RowNumber],  [Year], [Sales]  FROM (
        SELECT ID, RowNumber, [Sales 2013] as [2013], [Sales 2014] as [2014]
        FROM mytable) p     UNPIVOT (
        [Sales] FOR [Year] IN ([2013], [2014])  )AS unpvt ;
但我认为最好是深入到表结构的底部,因为实际数据包含更多的列和更多的年份来处理

使用示例数据

希望你能告诉我去那里的路。 多谢各位

SELECT [ID],
       [RowNumber],
       [Year],
       Sales,
       Budget
FROM   mytable
       CROSS APPLY (VALUES (2013, [Sales 2013], [Budget 2013]),
                           (2014, [Sales 2014], [Budget 2014]) ) 
                     V([Year], Sales, Budget) 

一种方法是在取消激励后重新激励,就像这样:

select [Id], [Year], [Sales], [Budget], [Actual] from
(SELECT [Id],
        Left([Colhead], charindex(' ',[Colhead])-1) [Category],
        Right([Colhead], len([Colhead])-charindex(' ',[Colhead])) [Year],
        [Figures]
 FROM (SELECT * FROM mytable) p
       UNPIVOT ([Figures] FOR [Colhead] IN 
                ([Sales 2013],[Sales 2014],[Budget 2013],[Budget 2014],[Actual 2013],[Actual 2014])
      )
 AS unpvt) as u
pivot
(max([Figures]) for [Category] in ([Sales], [Budget], [Actual])) as p

SQLFiddle.

谢谢你的两个答案-我会选择一个对我来说更容易阅读和理解的答案:-)支持SQLFiddle的好文章。这帮助我从一个可怕的实现中脱离出来,用一种可能的弗兰肯斯坦方法来实现UnPivot。