2016-12-17 5 views
1

行の値をSQL Serverの列の値に変換します SQL ServerのExample1 Table2を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」が2回表示されますか? –

+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

EDITダイナミック行く必要がある場合 - それは助けている場合、生成された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 
関連する問題