SQL Server 2016中结合GROUP BY与FOR XML PATH按ID聚合多行评论
解决方案
你只需把固定ID的筛选改为和外层查询的ID关联即可实现按ID分组聚合,不需要额外加GROUP BY子句,修改后的代码如下(兼容你原有写法逻辑):
SELECT DISTINCT c.ID, SUBSTRING((SELECT Comment FROM Comments c_inner WHERE c_inner.ID = c.ID AND c_inner.RegionCode != 2 FOR XML PATH('')), 1, 999999) AS Comment_Agg FROM Comments c
如果需要给评论之间加分隔符(比如空格、逗号),或者避免评论内的特殊字符(&、<、>等)被XML转义,建议使用优化写法:
SELECT DISTINCT c.ID, -- 示例用空格作为评论分隔符,可按需替换为其他字符 STUFF((SELECT ' ' + Comment FROM Comments c_inner WHERE c_inner.ID = c.ID AND c_inner.RegionCode != 2 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Comment_Agg FROM Comments c
逻辑说明
- 外层查询通过
DISTINCT c.ID拿到所有需要分组的ID,替代原来写死的ID = 1006固定值 - 子查询通过
c_inner.ID = c.ID关联外层的ID,自动按ID维度聚合符合条件的评论内容 - 优化写法中
TYPE+value的组合可以避免特殊字符被XML转义,STUFF函数用来删除第一个多余的分隔符
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

