将行值列为列值

时间:2016-12-17 13:47:29

标签: sql sql-server

将Rows值转换为SQL Server中的列值 我需要在SQL Server中将示例Table1转换为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

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;

答案 1 :(得分: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