SQL Server:按列分组对应每个值的实现咨询
SQL Server按列分组汇总对应End值的解决方案
嘿,欢迎加入论坛呀!能看得出来你既想参与贡献又想解决自己的技术问题,这点超棒~针对你现在遇到的SQL Server按Start Step分组,汇总对应End 1和End 2所有非NULL值的需求,我给你整理了两个实用的方案,你可以根据自己的SQL Server版本来选:
方案一:使用STRING_AGG(推荐,SQL Server 2017及以上版本)
STRING_AGG是SQL Server 2017引入的原生聚合函数,能直接把多行值合并成指定分隔符的字符串,用法简单高效。我们可以先把End 1和End 2的非NULL值整合到同一列,再按Start Step分组聚合:
SELECT [Start Step], STRING_AGG(EndValue, ', ') AS AllEndValues FROM ( -- 提取所有非NULL的End 1值 SELECT [Start Step], [End 1] AS EndValue FROM YourTableName WHERE [End 1] IS NOT NULL UNION ALL -- 提取所有非NULL的End 2值 SELECT [Start Step], [End 2] AS EndValue FROM YourTableName WHERE [End 2] IS NOT NULL ) AS CombinedEnds GROUP BY [Start Step] ORDER BY [Start Step];
代码说明:
- 内层子查询通过
UNION ALL将End 1和End 2的非NULL值合并到一个临时结果集CombinedEnds中; - 外层查询按
Start Step分组,用STRING_AGG把每个分组的EndValue拼接成逗号分隔的字符串; - 如果需要对结果去重(比如同一分组下有重复的End值),把
UNION ALL改成UNION即可。
方案二:适用于SQL Server 2016及更早版本
如果你的SQL Server版本不支持STRING_AGG,可以用STUFF+FOR XML PATH的经典组合来实现字符串拼接:
SELECT DISTINCT [Start Step], STUFF(( SELECT ', ' + CAST(EndValue AS VARCHAR(MAX)) FROM ( SELECT [Start Step], [End 1] AS EndValue FROM YourTableName WHERE [End 1] IS NOT NULL UNION ALL SELECT [Start Step], [End 2] AS EndValue FROM YourTableName WHERE [End 2] IS NOT NULL ) AS CombinedEnds WHERE CombinedEnds.[Start Step] = t.[Start Step] FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 2, '') AS AllEndValues FROM YourTableName t ORDER BY [Start Step];
代码说明:
- 同样先通过子查询合并
End 1和End 2的非NULL值; FOR XML PATH('')会把每个分组的结果拼接成无标签的XML字符串;STUFF函数用来去掉字符串开头多余的,(从第1位开始,删除2个字符);.value('.', 'VARCHAR(MAX)')用来把XML类型转换为普通字符串。
记得把代码里的YourTableName替换成你实际使用的表名哦!
内容的提问来源于stack exchange,提问作者Sandipan
相关产品推荐
相关产品推荐

