SQL如何基于Item、PartNumber两列将多行Description合并为单列
方案1:SQL Server 2017及以上版本(推荐)
使用内置STRING_AGG函数即可直接实现分组拼接,语法简洁性能更优:
SELECT bs.ITEMNAME AS Item, bom.ITEM AS PartNumber, STRING_AGG(ed.NOTE, ', ') AS Description FROM vwAXBOM bom LEFT JOIN S2BOMSTR bs ON bom.POSITION = bs.ITEMNUM LEFT JOIN vwExtendedDescriptionMFG ed ON bom.ITEM = ed.itemid WHERE bom.BOMITEM = @partNum AND bom.POSITION LIKE 'S%' AND bom.POSITION != 'S76' GROUP BY bs.ITEMNAME, bom.ITEM
方案2:SQL Server 2016及以下版本(兼容旧版本)
修正原有STUFF + FOR XML写法的逻辑问题即可:
SELECT DISTINCT bs.ITEMNAME AS Item, bom.ITEM AS PartNumber, STUFF(( SELECT ', ' + ed.NOTE FROM vwExtendedDescriptionMFG ed WHERE bom.ITEM = ed.itemid FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Description FROM vwAXBOM bom LEFT JOIN S2BOMSTR bs ON bom.POSITION = bs.ITEMNUM WHERE bom.BOMITEM = @partNum AND bom.POSITION LIKE 'S%' AND bom.POSITION != 'S76'
核心修改说明
- 原有写法的子查询缺少
FROM vwExtendedDescriptionMFG ed数据源,导致关联逻辑异常,每行仅返回单条备注 - 拼接前补了
,作为分隔符,用STUFF删除前两位多余的逗号和空格 - 新增
TYPE和.value逻辑处理特殊字符转义问题,避免&、<等符号被错误转为HTML实体 - 外层通过
GROUP BY或者DISTINCT去重,保证相同Item、PartNumber仅返回一行
内容的提问来源于stack exchange,提问作者Matthew Czajka
相关产品推荐
相关产品推荐

