You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:10:25