如何在SSMS中用单条查询合并多列多行的唯一值至单行?
在SSMS中实现分组合并多行数据
首先先确认你的测试表结构和插入数据(我帮你整理了格式):
CREATE TABLE Table1 ([C1] varchar(50), [C2] varchar(50), [C3] varchar(50)) ; INSERT INTO Table1 ([C1], [C2], [C3]) VALUES ('F92', 'Game1', 'b100'), ('F92', 'Game1', 'b200'), ('F92', 'Game2', 'C200'), ('F92', 'Game2', 'D400') ;
你已经写了STUFF+FOR XML PATH的核心思路,现在我帮你补全并优化这个查询,实现按C1和C2分组,把对应多条C3值合并成逗号分隔的字符串:
SELECT a.C1, a.C2, STUFF( (SELECT ', ' + C3 FROM Table1 WHERE C1 = a.C1 AND C2 = a.C2 FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 1, 2, '' ) AS Merged_C3 FROM Table1 a GROUP BY a.C1, a.C2;
关键逻辑解释:
FOR XML PATH(''):把子查询返回的多条C3值拼接成无标签的XML字符串,避免生成多余的XML节点。TYPE.value('.', 'varchar(max)'):将XML格式的结果转换为普通字符串,防止特殊字符(比如&、<)被转义成XML实体(比如&)。STUFF(..., 1, 2, ''):移除拼接字符串开头多余的,——子查询给每个C3前加了,,第一条的前缀需要删掉,这里指定从第1位开始删除2个字符。
执行后你会得到预期的合并结果:
| C1 | C2 | Merged_C3 |
|---|---|---|
| F92 | Game1 | b100, b200 |
| F92 | Game2 | C200, D400 |
如果你的SQL Server版本是2017及以上,还可以用更简洁高效的STRING_AGG函数实现,代码可读性更强:
SELECT C1, C2, STRING_AGG(C3, ', ') AS Merged_C3 FROM Table1 GROUP BY C1, C2;
内容的提问来源于stack exchange,提问作者Wsi
相关产品推荐
相关产品推荐

