2016-12-17 51 views
1

將行值轉換爲SQL Server中的列值 我需要將示例Table1轉換爲SQL Server中的Table2。其他解決方案爲每個服務器值顯示一個單獨的列,從而分別爲每個服務器A,B,C和D生成單獨的列。相反,如果B是唯一的服務器,我需要在列Server1而不是列ServerB中顯示,如建議的解決方案所示。任何幫助或指導,將不勝感激:將行值列表爲列值

TABLE1

Room | Server 
1  | A 
2  | B 
3  | C 
4  | A 
4  | B 
5  | C 
6  | A 
6  | B 
6  | C 
7  | D 

TABLE2

Room | Server1 | Server2 | Server3 
1  | A  
2  | B  
3  | C  | C  
4  | A  | B 
5  | C  
6  | A  | B  | C 
7  | D 
+0

你的意思是PIVOT? https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – TigOldBitties

+1

爲什麼房間3獲得「C」兩次? –

+0

對不起,這是錯字 –

回答

0

你想水平列出值。爲此,您需要對數據進行透視,但沒有透視的列。您可以使用row_number()生成一個。我更喜歡使用條件聚合做樞軸:

select room, 
     max(case when seqnum = 1 then server end) as server_1, 
     max(case when seqnum = 2 then server end) as server_2, 
     max(case when seqnum = 3 then server end) as server_3 
from (select t1.*, 
      row_number() over (partition by room order by server) as seqnum 
     from table1 t1 
    ) t1 
group by room; 
+0

謝謝!我很感激你的幫助。 –

0

就像戈登一樣,我傾向於使用條件聚合。但是,如果你需要去動態

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName('Server'+cast(Row_Number() over (Partition By Room Order by Server) as varchar(25))) From YourTable For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Room],' + @SQL + ' 
    From (Select Room,Server,Col=''Server''+cast(Row_Number() over (Partition By Room Order by Server) as varchar(25)) from YourTable) A 
Pivot (Max([Server]) For [Col] in (' + @SQL + ')) p' 
Exec(@SQL); 

返回

enter image description here

編輯 - 如果有幫助,生成的SQL是如下:

Select [Room],[Server1],[Server2],[Server3] 
    From (
     Select Room 
       ,Server 
       ,Col='Server'+cast(Row_Number() over (Partition By Room Order by Server) as varchar(25)) 
     From YourTable 
     ) A 
    Pivot (Max([Server]) For [Col] in ([Server1],[Server2],[Server3])) p