如何在SQL Server中按标志列合并多行数据为单行?
问题描述
当前查询返回结果如下:
SomeID SomeActions PendingFlag CompletedFlag 101 SomeAction1, SomeAction2 1 0 101 OtherAction1, OtherAction2 0 1
需要将结果转换为如下格式:
SomeID SomeActionsPending SomeActionsCompleted 101 SomeAction1, SomeAction2 OtherAction1, OtherAction2
请问如何编写SQL Server查询,基于特定列标志将此类数据合并为单行?
解决方案
可以通过条件聚合 + GROUP BY实现需求,核心逻辑是按SomeID分组,通过条件判断提取对应状态的动作内容,再用聚合函数筛选出目标值:
场景1:每个SomeID对应状态仅一条记录
SELECT SomeID, MAX(CASE WHEN PendingFlag = 1 THEN SomeActions END) AS SomeActionsPending, MAX(CASE WHEN CompletedFlag = 1 THEN SomeActions END) AS SomeActionsCompleted FROM YourTableName -- 替换为你的实际表名 GROUP BY SomeID;
GROUP BY SomeID:将同一SomeID的所有记录合并为一组CASE WHEN:仅保留对应状态标志为1的SomeActions内容,其他记录此位置为NULLMAX():在分组中筛选出非NULL的目标值(因为每个状态仅对应一条记录,MAX直接取到所需内容)
场景2:每个SomeID对应状态有多条记录,需合并动作内容
如果同一SomeID下同一状态存在多条记录,需要合并SomeActions,可以使用SQL Server 2017及以上版本支持的STRING_AGG函数:
SELECT SomeID, STRING_AGG(CASE WHEN PendingFlag = 1 THEN SomeActions END, ', ') AS SomeActionsPending, STRING_AGG(CASE WHEN CompletedFlag = 1 THEN SomeActions END, ', ') AS SomeActionsCompleted FROM YourTableName -- 替换为你的实际表名 GROUP BY SomeID;
这个版本会将同一状态下的多个SomeActions用逗号分隔合并成一串文本。
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

