如何使用STRING_AGG将多行按相同字段分组合并为单行?
解决多行合并(指定列逗号拼接)的SQL问题
嘿,你的需求很明确——把除Job列外其他列完全相同的多行数据合并成一行,同时将Job列的值用逗号拼接起来。你的思路方向是对的,但当前的SQL语句有个关键小问题需要修正:
问题出在哪?
你当前的GROUP BY子句里包含了Job列:
SELECT ID, Name, CP, STRING_AGG(Job, ',') FROM myTable GROUP BY ID, Name, CP, Job ORDER BY ID
这会导致每个不同的Job值都会被单独分组,自然无法实现合并效果。我们只需要按那些需要保持唯一的列(也就是除Job外的ID、Name、CP)分组即可。
修正后的SQL语句
SELECT ID, Name, CP, STRING_AGG(Job, ', ') AS Job -- 给拼接后的列指定别名,结果更清晰 FROM myTable GROUP BY ID, Name, CP -- 去掉GROUP BY里的Job ORDER BY ID;
如果希望拼接后的Job是有序的(比如按原顺序或字母顺序),可以在STRING_AGG里加上排序规则:
SELECT ID, Name, CP, STRING_AGG(Job, ', ') WITHIN GROUP (ORDER BY Job) AS Job FROM myTable GROUP BY ID, Name, CP ORDER BY ID;
验证效果
输入数据:
| ID | Name | CP | Job |
|---|---|---|---|
| 1 | Muse | 13 | Job1 |
| 1 | Muse | 13 | Job2 |
| 1 | Muse | 13 | Job3 |
| 2 | Tort | 51 | Job4 |
| 2 | Tort | 51 | Job5 |
执行修正后的SQL后,就能得到你期望的结果:
| ID | Name | CP | Job |
|---|---|---|---|
| 1 | Muse | 13 | Job1, Job2, Job3 |
| 2 | Tort | 51 | Job4, Job5 |
内容的提问来源于stack exchange,提问作者ordiminnie
相关产品推荐
相关产品推荐

