可能重复:
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
我该怎么做?我已经阅读了一些推荐合并功能的网站,但我似乎无法找到一种方法让它正常工作。
答案 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