T-SQL字符串连接多行

时间:2011-08-09 21:26:48

标签: sql sql-server sql-server-2008

  

可能重复:
  Simulating group_concat MySQL function in MS SQL Server 2005?
  Concatenate values based on 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

但我希望这张表看起来像:

111222                   AAAAA, BBBBB, CCCCC                 
111223                   AAAAA
111224                   AAAAA
111225                   AAAAA
111226                   DDDDD, EEEEE                   

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

2 个答案:

答案 0 :(得分: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 ;
  

同样,最初在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 ) 
  

您可能会注意到连接字符串末尾的逗号,您可以这样做   使用STUFF,SUBSTRING或LEFT函数删除。虽然如上   在撰写本文时,许多人认为这些方法是可靠的   不保证在内部运作的情况下它会保持这种状态   相关的FOR XML PATH()表达式的评估规则   子查询没有很好的记录。

答案 1 :(得分:1)

你可以这样做:

DECLARE @ProductCodeCSV as varchar(max)

select @ProductCodeCSV = COALESCE(@ProductCodeCSV + ', ', '') + [product_code]
from table
where part_ = 34175--@ID

select @ProductCodeCSV