SQL Server中如何将多行数据合并为指定格式的单行文本列
解决方法
你需要的是按chemical分组,将region和asset拼接后聚合为逗号分隔的字符串,PIVOT用于行转列(把行值转为列名),并不适配这个场景,应该使用字符串聚合类的方案:
方法一:使用STRING_AGG(SQL Server 2017及以上版本)
这是最简洁的实现方式,利用SQL Server内置的字符串聚合函数:
SELECT chemical AS Chemical, STRING_AGG(CONCAT(region, '_', asset), ', ') AS Info FROM chemical GROUP BY chemical
如果需要固定输出的排序顺序,可以加上WITHIN GROUP子句:
SELECT chemical AS Chemical, STRING_AGG(CONCAT(region, '_', asset), ', ') WITHIN GROUP (ORDER BY region, asset) AS Info FROM chemical GROUP BY chemical
方法二:兼容旧版本(SQL Server 2016及以下)
若你的SQL Server版本不支持STRING_AGG,可以用STUFF结合FOR XML PATH来实现字符串聚合:
SELECT DISTINCT chemical AS Chemical, STUFF( (SELECT ', ' + CONCAT(region, '_', asset) FROM chemical c2 WHERE c2.chemical = c1.chemical FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '' ) AS Info FROM chemical c1
最终输出结果
两种方法都会得到你预期的格式:
| Chemical | Info |
|---|---|
| a | region1_asset1, region1_asset2, region2_asset1 |
内容的提问来源于stack exchange,提问作者user22212195
相关产品推荐
相关产品推荐

