将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
答案 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);
返回
编辑 - 如果有帮助,生成的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