在SQL中转置两列

时间:2013-12-06 18:42:10

标签: sql sql-server

我对SQL很新。我在这个网站上永远寻找答案,但我不能。我的数据看起来像这样:

Code |  Name  
A    |  John  
A    |  Bob  
A    |  Chris  
B    |  James  
B    |  Jen  
B    |  Teddy  

我希望它能够构建一个导致此问题的查询:

Code | Name | Name2 | Name3  
A    | John |  Bob  | Chris  
B    | James|  Jen  | Teddy

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

解决方案是使用PIVOT。但是,PIVOT旨在用于“类别”值,这意味着每个组都有相同的类别集。每个组之间没有任何相似之处,例如“名称索引”或任何其他内容。因此,您无法正确识别PIVOT列。

简单的解决方案是为组中的每个名称制作一个类别,例如Name1Name2Name3等,您可以PIVOT开启。这可以使用ROW_NUMBER()这样的句子来完成:

select Code,
  'Name' + cast(
      row_number() over (partition by Code order by code)
  as varchar(10)) as NameType,
  Name
from table1

产生如下结果:

| CODE | NAMETYPE |  NAME |
|------|----------|-------|
|    A |    Name1 |  John |
|    A |    Name2 |   Bob |
|    A |    Name3 | Chris |
|    B |    Name1 | James |
|    B |    Name2 |   Jen |
|    B |    Name3 | Teddy |

现在,您在PIVOT列的NAMETYPE群组之间共享了一些内容:

select * from ( 
  select Code,
    'Name' + cast(
        row_number() over (partition by Code order by code)
    as varchar(10)) as NameType,
    Name
  from table1
) a
pivot ( max(Name) for [NameType] in ([Name1], [Name2], [Name3]) ) piv

这会产生预期的结果:

| CODE | NAME1 | NAME2 | NAME3 |
|------|-------|-------|-------|
|    A |  John |   Bob | Chris |
|    B | James |   Jen | Teddy |

演示:http://www.sqlfiddle.com/#!6/21499/7