sqlserver 多条记录合并
在SQL Server中,如果需要将多条记录合并成一条记录,可以使用聚合函数(如STRING_AGG
)、FOR XML PATH
方法或者PIVOT
操作。以下是详细的方法和示例:
方法一:使用 STRING_AGG 函数(SQL Server 2017 及以上版本)
STRING_AGG
函数用于将多行文本值连接为单个字符串,并可以指定分隔符。
示例:
假设有一个 Orders
表,存储了每个订单的产品名称:
OrderID | ProductName |
---|---|
1 | Product A |
1 | Product B |
1 | Product C |
使用 STRING_AGG
可以将同一 OrderID
下的产品名称合并为一个字符串:
sqlSELECT OrderID, STRING_AGG(ProductName, ', ') AS Products
FROM Orders
GROUP BY OrderID;
输出:
OrderID | Products |
---|---|
1 | Product A, Product B, Product C |
方法二:使用 FOR XML PATH 方法(适用于所有版本)
FOR XML PATH
方法结合子查询和 STUFF 函数,可以实现多行合并为单行。
示例:
sqlSELECT 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
操作,但前提是要有一个可以作为标识每行数据唯一性的列。
示例:
sqlSELECT 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;
输出:
OrderID | Product1 | Product2 | Product3 |
---|---|---|---|
1 | Product A | Product B | Product C |
总结:
在SQL Server中合并多条记录为一条记录的方法包括使用 STRING_AGG
函数(适用于 SQL Server 2017 及以上版本)、FOR XML PATH
方法和 PIVOT
操作(适用于特定需求)。选择合适的方法取决于具体的需求和数据库版本。