SQL Server中如何将特定员工的两行数据合并为一行?
SQL Server 合并特定员工两行记录为一行的最优方案
针对你需要将特定EMP_ID员工的两行记录合并为一行、展示所有列的需求,以下是几种高效实现方案:
方案一:MAX/CASE 聚合(适用于互补型数据)
如果两行数据的列是互补状态(某列一行有值、另一行为空),直接通过MAX()聚合函数结合GROUP BY即可合并,MAX()会自动忽略空值,保留有效数据:
SELECT EMP_ID, MAX(Name) AS Name, MAX(Department) AS Department, MAX(Phone) AS Phone, MAX(Email) AS Email, MAX(Address) AS Address -- 依次列出所有需要展示的列 FROM YourEmployeeTable WHERE EMP_ID = '目标员工ID' -- 替换为实际EMP_ID GROUP BY EMP_ID;
方案二:STRING_AGG 拼接(适用于同列多值场景)
如果同一列存在多个不同有效值需要保留(比如员工有多个手机号),使用STRING_AGG()拼接多个值:
SELECT EMP_ID, MAX(Name) AS Name, MAX(Department) AS Department, STRING_AGG(Phone, ', ') AS PhoneList, -- 用逗号分隔多个手机号 MAX(Email) AS Email FROM YourEmployeeTable WHERE EMP_ID = '目标员工ID' GROUP BY EMP_ID;
方案三:窗口函数筛选(适用于有优先级的场景)
如果需要指定保留某一行的优先数据(比如取最新录入的记录),用ROW_NUMBER()窗口函数标记行号后筛选:
WITH RankedEmp AS ( SELECT *, -- 按需要的排序规则(比如创建时间倒序)标记行号 ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY CreateTime DESC) AS rn FROM YourEmployeeTable WHERE EMP_ID = '目标员工ID' ) SELECT EMP_ID, Name, Department, Phone, Email, Address -- 列出所有列 FROM RankedEmp WHERE rn = 1;
说明
之前直接用GROUP BY无效,是因为SQL Server要求非分组列必须使用聚合函数,否则无法确定要保留哪一行的列值。上述方案通过聚合函数或窗口函数解决了这个问题,可根据你的数据实际情况选择最优方案。
内容的提问来源于stack exchange,提问作者Blowers
相关产品推荐
相关产品推荐

