我刚刚在 SQL Server 上学习 SQL。我需要将多行连接成一列。我已经查找了示例,但没有找到可以满足我需求的示例。
Country ProjectTA Complexity TID Sites Inits Name
United States A8022 Obesity Low 4692 69 JT AD
United States A8022 Obesity Low 4692 69 jpni CBM Budget
United States A8022 Obesity Low 4692 69 PIHR AD
United States A8022 Obesity Low 4692 69 jpni CBM Budget
United States A8022 Obesity Low 4692 69 hale ePublishing Group
United States S8033 CNS Medium 5423 69 ShyP CBM Payment
United States S8033 CNS Medium 5423 69 dedu ePublishing Group
United States S8033 CNS Low 5423 69 AHrp ePublishing Group
我想按 Name 连接行,并用 ',' 列出 Inits
United States A8022 Obesity Low 4692 69 JT,PIHR AD
United States A8022 Obesity Low 4692 69 jpni, PIHR CBM Budget
United States A8022 Obesity Low 4692 69 hale ePublishing Group
United States S8033 CNS Medium 5423 69 ShyP CBM Payment
United States S8033 CNS Medium 5423 69 dedu, Ahrp ePublishing Group
任何帮助将不胜感激。非常感谢。
最佳答案
不幸的是,SQL Server 没有一个简单的函数来生成逗号分隔的列表,你必须实现 FOR XML PATH
来获取列表。
有几种方法可以做到这一点,您可以使用 STUFF
和 FOR XML PATH
:
select distinct t1.country,
t1.ProjectTA,
t1.Complexity,
t1.TID,
t1.Sites,
STUFF(
(SELECT ', ' + t2.Inits
FROM yt t2
where t1.Country = t2.Country
and t1.ProjectTA = t2.ProjectTA
and t1.TID = t2.TID
and t1.Sites = t2.Sites
and t1.name = t2.name
FOR XML PATH (''))
, 1, 1, '') AS inits,
t1.name
from yt t1;
或者您可以使用 CROSS APPLY
和 FOR XML PATH
:
select distinct t1.country,
t1.ProjectTA,
t1.Complexity,
t1.TID,
t1.Sites,
left(t2.inits, len(t2.inits)-1) inits,
t1.name
from yt t1
cross apply
(
select t2.Inits + ', '
from yt t2
where t1.Country = t2.Country
and t1.ProjectTA = t2.ProjectTA
and t1.TID = t2.TID
and t1.Sites = t2.Sites
and t1.name = t2.name
FOR XML PATH('')
) t2 (inits);
见 SQL Fiddle with Demo .这些都产生了结果:
| COUNTRY | PROJECTTA | COMPLEXITY | TID | SITES | INITS | NAME |
-------------------------------------------------------------------------------------------
| United States | A8022 | Obesity Low | 4692 | 69 | hale | ePublishing Group |
| United States | A8022 | Obesity Low | 4692 | 69 | jpni, jpni | CBM Budget |
| United States | A8022 | Obesity Low | 4692 | 69 | JT, PIHR | AD |
| United States | S8033 | CNS Low | 5423 | 69 | dedu, AHrp | ePublishing Group |
| United States | S8033 | CNS Medium | 5423 | 69 | dedu, AHrp | ePublishing Group |
| United States | S8033 | CNS Medium | 5423 | 69 | ShyP | CBM Payment |
关于sql - 将多行连接成一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288501/