T-SQL字符串连接多行

sal*_*ere 2 sql sql-server sql-server-2008

可能的重复:
在MS SQL Server 2005中模拟group_concat MySQL函数?
根据ID连接值

我正在尝试在SSMS 2008中编写一个SQL查询,以便按单列进行分组.我有一个只有两列的表:部件号和产品代码.这两列都是VARCHAR数据类型.

现在我的表看起来像:

Part Number              Product Code
111222                   AAAAA
111222                   BBBBB
111222                   CCCCC
111223                   AAAAA
111224                   AAAAA
111225                   AAAAA
111226                   DDDDD
111226                   EEEEE
Run Code Online (Sandbox Code Playgroud)

但我希望这个表格看起来像:

111222                   AAAAA, BBBBB, CCCCC                 
111223                   AAAAA
111224                   AAAAA
111225                   AAAAA
111226                   DDDDD, EEEEE                   
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?我已经阅读了一些推荐合并功能的网站,但我似乎无法找到一种方法让它正常工作.

Cod*_*ian 11

几种方法http://web.archive.org/web/20120429052520/http://www.projectdmx.com/tsql/rowconcatenate.aspx

文章详细介绍了在这个答案中列出的太多方法,但我最喜欢的方法就是这个:

黑盒XML方法

下面详细介绍使用带有PATH模式的FOR XML子句进行字符串连接的示例.它最初由Eugene Kogan发布,后来在公共新闻组中变得普遍.

SELECT p1.CategoryId,
      ( SELECT ProductName + ',' 
          FROM Northwind.dbo.Products p2
         WHERE p2.CategoryId = p1.CategoryId
         ORDER BY ProductName
           FOR XML PATH('') ) AS Products
  FROM Northwind.dbo.Products p1
 GROUP BY CategoryId ;
Run Code Online (Sandbox Code Playgroud)

同样,最初在beta新闻组中找到的类似方法,使用CROSS APPLY运算符.

SELECT DISTINCT CategoryId, ProductNames
  FROM Products p1
 CROSS APPLY ( SELECT ProductName + ',' 
                 FROM Products p2
                WHERE p2.CategoryId = p1.CategoryId 
                ORDER BY ProductName 
                  FOR XML PATH('') )  D ( ProductNames ) 
Run Code Online (Sandbox Code Playgroud)

您可能会注意到连接字符串末尾的逗号,您可以使用STUFF,SUBSTRING或LEFT函数删除它.虽然上述方法在撰写本文时被许多人认为是可靠的,但鉴于相关子查询中的FOR XML PATH()表达式的内部工作和评估规则没有很好地记录,因此不能保证它会保持这种方式.