求助:基于OrganisationId等条件合并SQL Server行的单SQL查询实现
可以通过单个SQL查询实现需求
完全可以通过单个SQL查询实现你的需求,核心思路是按OrganisationId、start date、end date分组,对每组内的其他列进行聚合处理(比如字符串拼接、数值求和等,根据你的实际列类型选择)。
方案1:SQL Server 2017及以上版本(推荐)
使用STRING_AGG函数直接拼接同组内的列值,语法简洁高效:
假设你的表名为YourTable,需要合并的其他列是Column1、Column2,示例查询如下:
SELECT OrganisationId, [start date], [end date], -- 用逗号拼接同组内的Column1值,可自定义分隔符 STRING_AGG(Column1, ', ') AS MergedColumn1, STRING_AGG(Column2, ', ') AS MergedColumn2 FROM YourTable -- 按指定三列分组 GROUP BY OrganisationId, [start date], [end date]
方案2:SQL Server 2016及以下版本
如果你的SQL Server版本不支持STRING_AGG,可以用STUFF + FOR XML PATH的组合实现字符串拼接:
SELECT t.OrganisationId, t.[start date], t.[end date], -- 拼接Column1 STUFF(( SELECT ', ' + Column1 FROM YourTable WHERE OrganisationId = t.OrganisationId AND [start date] = t.[start date] AND [end date] = t.[end date] FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS MergedColumn1, -- 拼接Column2 STUFF(( SELECT ', ' + Column2 FROM YourTable WHERE OrganisationId = t.OrganisationId AND [start date] = t.[start date] AND [end date] = t.[end date] FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS MergedColumn2 FROM YourTable t GROUP BY t.OrganisationId, t.[start date], t.[end date]
注意事项
- 如果分组后某些列的值是唯一的(比如同组内
Status列全部相同),可以直接用MAX(Status)或MIN(Status)来获取该值,无需拼接。 - 若你需要保留原始行的所有细节但仅在组内合并展示,可根据实际需求调整聚合逻辑。
内容的提问来源于stack exchange,提问作者Spandana
相关产品推荐
相关产品推荐

