You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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里

执行后会得到一行合并结果:

Col1Col2Col3CombinedDiffCol
1CustomerA2024-05-01 00:00:00Order001; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:01:25