2012-10-26 145 views
1

我有一個表的格式如下的SQL Server 2008:轉換列值排

 
Country_Code | 1960 | 1961 | 1962 | ..... | 2011 
------------------------------------------------ 
IND   | va11 | va12 | va13 | ..... | va1x 
AUS   | va21 | va22 | va23 | ..... | va2x 
ENG   | va31 | va32 | va33 | ..... | va3x 

我想把它轉換成以下格式

 
Country_Code | Year | Value 
--------------------------- 
IND   | 1960 | va11 
IND   | 1961 | va12 
IND   | 1962 | va13 
. 
. 
IND   | 2011 | va1x 
AUS   | 1960 | va21 
AUS   | 1961 | va22 
AUS   | 1962 | va23 
. 
. 
AUS   | 2011 | va2x 
ENG   | 1960 | va31 
ENG   | 1961 | va32 
ENG   | 1962 | va33 
. 
. 
ENG   | 2011 | va3x 

這又如何通過SQL實現查詢或sql服務器程序集?

+0

您應該檢查在SQL服務器 –

+0

的PIVOT/UNPIVOT謝謝你的信息Yograj。 UNPIVOT方法幫助我:) –

回答

8

您可以使用UNPIVOT完成。如果你有一個已知的數列,那麼你可以硬編碼值:

select Country_Code, year, value 
from yourtable 
unpivot 
(
    value 
    for year in ([1960], [1961], [1962], [2011]) 
) u 

SQL Fiddle with Demo

如果你有一個未知的列數,那麼你可以使用動態SQL:

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') and 
       C.name != 'Country_Code' 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select country_code, year, value 
    from yourtable 
    unpivot 
    (
     value 
     for year in ('+ @colsunpivot +') 
    ) u' 

exec(@query) 

SQL Fiddle with Demo

,你甚至可以用一個UNION ALL

select country_code, '1960' year, 1960 value 
from yourtable 
union all 
select country_code, '1961' year, 1961 value 
from yourtable 
union all 
select country_code, '1962' year, 1962 value 
from yourtable 
union all 
select country_code, '2011' year, 2011 value 
from yourtable 

SQL Fiddle with Demo

+0

哇!這很快,非常快:)我知道列的數量,因此使用UNPIVOT的第一種方法就像一個魅力。非常感謝:) –

+0

@ArjunGanesan樂意提供幫助,一定要通過左邊的複選標記接受答案,這將有助於未來的訪問者,並增加您在網站上的聲譽。 – Taryn