SQL使用静态标头将行转换为列

时间:2016-07-13 00:28:30

标签: sql sql-server sql-server-2014

我有一个数据集,我需要从行转换为列。

我查看了pivot并没有真正解决问题,因为我需要特定的静态列标题(不匹配数据名称)。

以下是当前数据的存储方式:

Id | SpCode    
------------------------- 
1    AA  
1    BB    
1    CC    
2    FF    
2    LL    
3    TT    
3    YY    
3    ZZ    
3    XX    
4    AA    
4    BB        
5    AA    
6    WW    
6    MM    
6    PP   

我需要像这样显示它。

我永远不会超过5列,并希望保持列名静态,以便我可以轻松加入并引用它。

ID  SpCode1 |SpCode2 | SpCode3 | SpCode4 | SpCode5
1   AA      |BB      | CC       
2   FF      |LL         
3   TT      |YY      |ZZ       |XX  
4   AA      |BB                 
5   AA              
6   WW      |MM      |PP        

非常感谢任何帮助。

PS:使用SQL Server 2014

由于

奥伦

1 个答案:

答案 0 :(得分:3)

一种方法是pivot。另一个是条件聚合。我发现后者更容易使用:

select id,
       max(case when seqnum = 1 then spcode end) as spcode_1,
       max(case when seqnum = 2 then spcode end) as spcode_2,
       max(case when seqnum = 3 then spcode end) as spcode_3,
       max(case when seqnum = 4 then spcode end) as spcode_4,
       max(case when seqnum = 5 then spcode end) as spcode_5
from (select t.*,
             row_number() over (partition by id order by spcode) as seqnum
      from t
     ) t
group by id;