我对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
非常感谢任何帮助。
答案 0 :(得分:1)
解决方案是使用PIVOT
。但是,PIVOT
旨在用于“类别”值,这意味着每个组都有相同的类别集。每个组之间没有任何相似之处,例如“名称索引”或任何其他内容。因此,您无法正确识别PIVOT
列。
简单的解决方案是为组中的每个名称制作一个类别,例如Name1
,Name2
,Name3
等,您可以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 |