求基于分组拼接列数据并求和的T-SQL脚本
T-SQL 分组拼接Ref3并求和wt
以下针对不同版本的SQL Server提供解决方案,假设你的数据表名为YourTable,字段为[REF 1]、[REF 2]、[Ref 3]、wt(字段含空格需用方括号包裹):
方案1:SQL Server 2017及以上(推荐)
使用内置函数STRING_AGG可以简洁实现字符串拼接,分两种场景:
场景A:同一组Ref3共享固定前缀(如示例的14928-),合并后缀部分
SELECT [REF 1], [REF 2], -- 提取前缀并拼接所有后缀 CONCAT( LEFT(MIN([Ref 3]), CHARINDEX('-', MIN([Ref 3]))), STRING_AGG(RIGHT([Ref 3], LEN([Ref 3]) - CHARINDEX('-', [Ref 3])), '/') ) AS Combined_Ref3, SUM(wt) AS Total_Wt FROM YourTable GROUP BY [REF 1], [REF 2];
场景B:直接拼接所有Ref3值
如果不需要合并前缀,直接将同一组的Ref3用/连接:
SELECT [REF 1], [REF 2], STRING_AGG([Ref 3], '/') AS Combined_Ref3, SUM(wt) AS Total_Wt FROM YourTable GROUP BY [REF 1], [REF 2];
方案2:SQL Server 2016及以下版本
低版本无STRING_AGG,使用STUFF + FOR XML PATH组合实现拼接:
场景A:合并前缀与后缀
SELECT t.[REF 1], t.[REF 2], CONCAT( LEFT(MIN(t.[Ref 3]), CHARINDEX('-', MIN(t.[Ref 3]))), STUFF( ( SELECT '/' + RIGHT(s.[Ref 3], LEN(s.[Ref 3]) - CHARINDEX('-', s.[Ref 3])) FROM YourTable s WHERE s.[REF 1] = t.[REF 1] AND s.[REF 2] = t.[REF 2] FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) ) AS Combined_Ref3, SUM(t.wt) AS Total_Wt FROM YourTable t GROUP BY t.[REF 1], t.[REF 2];
场景B:直接拼接所有Ref3值
SELECT t.[REF 1], t.[REF 2], STUFF( ( SELECT '/' + s.[Ref 3] FROM YourTable s WHERE s.[REF 1] = t.[REF 1] AND s.[REF 2] = t.[REF 2] FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS Combined_Ref3, SUM(t.wt) AS Total_Wt FROM YourTable t GROUP BY t.[REF 1], t.[REF 2];
注意事项
- 若
[Ref 3]中存在特殊字符(如&、<),FOR XML PATH会自动转义,上述代码通过TYPE.value已处理该问题。 - 确保分组字段
[REF 1]和[REF 2]的数据类型一致,避免分组逻辑错误。
内容的提问来源于stack exchange,提问作者user2324065
相关产品推荐
相关产品推荐

