SQL Server中如何将同ID的两行数据合并为一列?
SQL Server 数据合并解决方案
根据你提到的需求,分两种常见场景给出对应实现方式:
1. 行转列(适用Pivot的场景)
如果你的需求是将同一分组下的多行数据,按指定字段转换为列(比如把类别作为列名,对应值作为列值),用PIVOT实现:
假设原始表结构及数据如下:
| 订单ID | 品类 | 金额 |
|---|---|---|
| 101 | 商品A | 200 |
| 101 | 商品B | 300 |
| 102 | 商品A | 150 |
目标合并结果:
| 订单ID | 商品A | 商品B |
|---|---|---|
| 101 | 200 | 300 |
| 102 | 150 | NULL |
对应的SQL代码:
SELECT 订单ID, 商品A, 商品B FROM ( SELECT 订单ID, 品类, 金额 FROM 你的原始表名 ) AS SourceData PIVOT ( MAX(金额) -- 若同一分组+品类有重复值,按需用SUM/MAX/MIN聚合 FOR 品类 IN (商品A, 商品B) -- 列出要转为列的所有品类值 ) AS PivotResult;
2. 同组多行字符串合并
如果你的需求是将同一分组下的多行文本合并为单个字符串(比如把同一订单的标签合并成逗号分隔的字符串),用STRING_AGG(SQL Server 2017+支持):
假设原始表结构及数据如下:
| 订单ID | 标签 |
|---|---|
| 101 | 加急 |
| 101 | 包邮 |
| 102 | 预售 |
目标合并结果:
| 订单ID | 合并标签 |
|---|---|
| 101 | 加急, 包邮 |
| 102 | 预售 |
对应的SQL代码:
SELECT 订单ID, STRING_AGG(标签, ', ') AS 合并标签 -- 第二个参数是自定义分隔符 FROM 你的原始表名 GROUP BY 订单ID;
如果使用SQL Server 2016及更早版本,用STUFF + FOR XML PATH替代:
SELECT 订单ID, STUFF(( SELECT ', ' + 标签 FROM 你的原始表名 t2 WHERE t2.订单ID = t1.订单ID FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS 合并标签 FROM 你的原始表名 t1 GROUP BY 订单ID;
如果你的实际场景和上述示例不符,提供原始表的字段名、样本数据以及目标结果的具体格式,可给出更精准的代码。
内容的提问来源于stack exchange,提问作者Amiel Echizen
相关产品推荐
相关产品推荐

