MS SQL将行转换为列

时间:2016-12-27 16:49:34

标签: sql-server pivot

我需要将表格从(A)转换为(B) 我可以通过多次加入同一个表并使用Max运算符来分配字段来实现它,但有没有更好的方法来实现这一点,因为Max运算符可能会导致巨大的表格出现性能问题。
这可以通过使用枢轴来完成,并且会在巨大的桌面上引起任何性能问题吗? 顺便说一句,下面的示例中的ID只是其中一个字段,例如,还有其他字段需要实现相同的功能。

(A)
班级号
1 11
1 12
1 13
2 11
2 12
2 13

(B)
ID2类ID3 ID4
1 11 12 13
2 11 12 13

2 个答案:

答案 0 :(得分:1)

你可以PIVOT

SELECT *
FROM
  (SELECT * FROM MY_TABLE
  ) pivot ( MAX(id) FOR id IN ([11],[12],[13]) );

答案 1 :(得分:1)

假设你需要去DYNAMIC

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(concat('ID',1+Row_Number() over (Partition By Class Order By ID))) From YourTable  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
Select [Class],' + @SQL + '
From (
       Select [Class]
             ,ID
             ,Col = concat(''ID'',1+Row_Number() over (Partition By [Class] Order By [ID]))
         From YourTable 
     ) A
 Pivot (max(ID) For [Col] in (' + @SQL + ') ) P'
Exec(@SQL);

返回

Class   ID2 ID3 ID4
1       11  12  13
2       11  12  13