如何在MSSQL中提取仅一列不同的两行数据并合并为单行
解决方案
嘿,这个合并相同行、保留差异列的需求我之前也碰到过,给你两种实用的解决方法,根据你的SQL Server版本选就行:
方法一:使用STRING_AGG(SQL Server 2017及以上版本)
如果你的SQL Server是2017或更新版本,STRING_AGG是最省心的选择,它专门用来把分组内的列值拼接成字符串。
假设你的表结构和测试数据是这样的(可以替换成你实际的表名和列名):
CREATE TABLE YourTable ( Col1 INT, Col2 VARCHAR(50), Col3 DATETIME, DiffCol VARCHAR(50) -- 这是两行唯一不同的列 ); INSERT INTO YourTable VALUES (1, 'CustomerA', '2024-05-01', 'Order001'), (1, 'CustomerA', '2024-05-01', 'Order002');
合并查询的语句:
SELECT Col1, Col2, Col3, STRING_AGG(DiffCol, '; ') AS CombinedDiffCol -- 用分号分隔差异值,分隔符可以自定义 FROM YourTable GROUP BY Col1, Col2, Col3; -- 所有相同的列必须都放在GROUP BY里
执行后会得到一行合并结果:
| Col1 | Col2 | Col3 | CombinedDiffCol |
|---|---|---|---|
| 1 | CustomerA | 2024-05-01 00:00:00 | Order001; Order002 |
方法二:使用STUFF + FOR XML PATH(兼容旧版本SQL Server)
如果你的SQL Server版本低于2017,这个经典方法兼容性拉满,能搞定所有旧版本的拼接需求。
还是用上面的测试表和数据,查询语句如下:
SELECT DISTINCT t1.Col1, t1.Col2, t1.Col3, STUFF( (SELECT '; ' + t2.DiffCol FROM YourTable t2 WHERE t2.Col1 = t1.Col1 AND t2.Col2 = t1.Col2 AND t2.Col3 = t1.Col3 FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '' -- 去掉开头多余的分号和空格 ) AS CombinedDiffCol FROM YourTable t1;
逻辑很简单:子查询用FOR XML PATH把同组的差异列拼成带分隔符的字符串,再用STUFF删掉开头的冗余分隔符,最后用DISTINCT确保只返回一行合并结果。
补充小贴士
- 如果差异列是数值类型,你可以换成
SUM(DiffCol)、MAX(DiffCol)这类聚合函数,不用字符串拼接。 - 一定要把
GROUP BY(方法一)或关联条件(方法二)里的列替换成你实际的非差异列,不然会出现分组错误或者重复行。
内容的提问来源于stack exchange,提问作者Nikson
相关产品推荐
相关产品推荐

