2012-03-09 79 views
1

原文:SQL Server 2008中逆透視轉換列的未知#到行

EmpID  Week1  Week2 Week3...(Unknown unmber of weeks) 
001  1   2  3 
002  2   1  0 
003  3   4  0 

目標:

EmpID Attibute AttributeValue 
001   Week1  1 
001   Week2  2 
001   Week3  3 
002   Week1  2 
002   Week2  1 
002   Week3  0 
003   Week1  3 
003   Week2  4 
003   Week3  0 
      . 
      . 
      . 
(will auto generate unknown # of weeks and their values) 

我做我的功課,我還沒有發現這樣一個quesiton。我發現的唯一一個類似的是「Dynamic SQL Server Pivot (UNPIVOT) column name to a row value」。我試圖運行該查詢,但SQL Server沒有返回任何結果,並且消息顯示「命令已成功完成」。

回答

2

好吧,表中不能有「未知」列數,但請參見Using PIVOT and UNPIVOT

SELECT EmpID, Attibute, AttributeValue 
FROM 
    (SELECT EmpID, Week1, Week2, Week3 
    FROM pvt) p 
UNPIVOT 
    (AttributeValue FOR Attibute IN 
     (Week1, Week2, Week3) 
)AS unpvt 
1

假設你的表名是Emp並且要UNPIVOT匹配Week%列:

declare @SQL nvarchar(max) 

set @SQL = 
    N'select EmpID, Attribute, AttributeValue from Emp unpivot (AttributeValue for Attribute in ('+ 
    stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('Emp') and 
       C.name like 'Week%' 
     for xml path('')), 1, 1, '')+ 
    N')) as U order by EmpID, Attribute' 

exec (@SQL)