2013-05-13 48 views
4

如何在「one」中取消多個列?TSQL - Unpivot多列

現在我對每一列都有一個unpivot,但是這會產生很多空行。

請看截圖。 enter image description here

在頂部您會看到輸入數據。目前,我在此代碼中間表:

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 ; 

但我認爲這將是更好的去底表結構,因爲實際的數據包含更多的列和多年應對用。

Here's a Fiddle與樣本數據。

希望你能告訴我一種方法去那裏。 謝謝。

回答

8
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) 

SQL Fiddle

+0

謝謝你的答案 - 我會選擇一個更容易閱讀和理解的答案:-) – SvenB 2013-05-13 14:05:49

+0

支持SQL小提琴的好貼子。這幫助我偏離了對UnPivot可能的Frankenstein方法的可怕實現。 – GoldBishop 2016-10-04 16:08:07

2

一種方法是unpivoting後repivot - 像這樣:

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 here