sqlserver 多条记录合并

在SQL Server中,如果需要将多条记录合并成一条记录,可以使用聚合函数(如STRING_AGG)、FOR XML PATH方法或者PIVOT操作。以下是详细的方法和示例:

方法一:使用 STRING_AGG 函数(SQL Server 2017 及以上版本)

STRING_AGG 函数用于将多行文本值连接为单个字符串,并可以指定分隔符。

示例:

假设有一个 Orders 表,存储了每个订单的产品名称:

OrderIDProductName
1Product A
1Product B
1Product C

使用 STRING_AGG 可以将同一 OrderID 下的产品名称合并为一个字符串:

sql
SELECT OrderID, STRING_AGG(ProductName, ', ') AS Products FROM Orders GROUP BY OrderID;

输出:

OrderIDProducts
1Product A, Product B, Product C

方法二:使用 FOR XML PATH 方法(适用于所有版本)

FOR XML PATH 方法结合子查询和 STUFF 函数,可以实现多行合并为单行。

示例:

sql
SELECT OrderID, STUFF((SELECT ', ' + ProductName FROM Orders o2 WHERE o1.OrderID = o2.OrderID FOR XML PATH('')), 1, 2, '') AS Products FROM Orders o1 GROUP BY OrderID;

输出与 STRING_AGG 方法相同。

方法三:使用 PIVOT 操作(如果需要将多行数据转换为单行,适用于特定情况)

如果需要将多行数据转换为单行,可以使用 PIVOT 操作,但前提是要有一个可以作为标识每行数据唯一性的列。

示例:

sql
SELECT OrderID, MAX(CASE WHEN rn = 1 THEN ProductName END) AS Product1, MAX(CASE WHEN rn = 2 THEN ProductName END) AS Product2, MAX(CASE WHEN rn = 3 THEN ProductName END) AS Product3 FROM ( SELECT OrderID, ProductName, ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY ProductName) AS rn FROM Orders ) AS pivoted GROUP BY OrderID;

输出:

OrderIDProduct1Product2Product3
1Product AProduct BProduct C

总结:

在SQL Server中合并多条记录为一条记录的方法包括使用 STRING_AGG 函数(适用于 SQL Server 2017 及以上版本)、FOR XML PATH 方法和 PIVOT 操作(适用于特定需求)。选择合适的方法取决于具体的需求和数据库版本。