SQL按Licence分组拼接Item为逗号分隔列表的问题求助
修正SQL分组拼接Item字段的问题
问题分析
原查询的核心错误有两个:
- 子查询未按
Licence过滤,导致每次拼接所有Item值,而非当前分组的内容 - 不必要的自连接引入冗余逻辑,
DISTINCT只是临时去重,未解决根本分组问题
修正后的查询语句
SELECT [Order], Customer, Contract, Licence, CSSNT, '[' + STRING_AGG(ISNULL(Item, ' '), ',') + ']' AS Item FROM #WorkingTable2 GROUP BY [Order], Customer, Contract, Licence, CSSNT
语句说明
- 分组逻辑:按
Order、Customer、Contract、Licence、CSSNT分组,从源数据来看,同一Licence对应的这些字段值完全一致,分组后会自动聚合为一行 - 拼接处理:使用
STRING_AGG函数直接对分组内的Item进行逗号分隔拼接,前后添加方括号完成格式要求 - 空值处理:保留原逻辑中的
ISNULL(Item, ' '),避免空Item导致拼接异常
如果需要固定Item的拼接顺序,可在STRING_AGG中添加排序规则:
SELECT [Order], Customer, Contract, Licence, CSSNT, '[' + STRING_AGG(ISNULL(Item, ' '), ',') WITHIN GROUP (ORDER BY Item) + ']' AS Item FROM #WorkingTable2 GROUP BY [Order], Customer, Contract, Licence, CSSNT
验证结果
执行上述语句后,将得到与期望完全一致的结果:
| Order | Customer | Contract | Licence | Item | CSSNT |
|---|---|---|---|---|---|
| 5762 | 5273 | 70703US | 420D3 | [8.10,8.9] | ABC02 |
| 1234 | 1111 | 123US | 1234 | [9.10] | ABC01 |
内容的提问来源于stack exchange,提问作者Michael Thomas
相关产品推荐
相关产品推荐

