SQL Server如何将分组查询的多行结果拼接合并为单字段列表
SQL Server 分组拼接字段实现方案
需求说明
需要对测试表#PatientMeds按name字段分组,将同分组下的所有medication字段值用逗号+空格拼接为单个字段。
实现方案
方案1:SQL Server 2017及更高版本(最优)
SQL Server 2017开始内置STRING_AGG聚合函数,专门用于分组拼接场景,语法简洁性能最优:
SELECT name, STRING_AGG(medication, ', ') AS medication FROM #PatientMeds GROUP BY name
如果需要对拼接的内容排序,可以追加WITHIN GROUP子句:
SELECT name, STRING_AGG(medication, ', ') WITHIN GROUP (ORDER BY medication) AS medication FROM #PatientMeds GROUP BY name
方案2:SQL Server 2016及更早版本兼容
低版本SQL Server没有内置拼接函数,可通过FOR XML PATH + STUFF组合实现:
SELECT DISTINCT t1.name, STUFF( ( SELECT ', ' + t2.medication FROM #PatientMeds t2 WHERE t2.name = t1.name FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 2, '' ) AS medication FROM #PatientMeds t1
逻辑说明:
FOR XML PATH('')将同分组下的多行medication值拼接为形如, Med 1, Med 2的字符串STUFF函数删除开头多余的2个字符(逗号+空格)TYPE+.value处理避免特殊字符(如&、<)被XML转义的问题
内容的提问来源于stack exchange,提问作者Donald B
相关产品推荐
相关产品推荐

