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

Oracle数据库模式关系中按经理EID统计员工平均薪资的SQL问题

解决Oracle中统计经理下属平均薪资的问题

我来帮你搞定这个问题!首先咱们先按Oracle里最常用的员工-经理数据结构来分析(如果你的表结构略有不同,调整字段名就行):通常员工表(比如命名为EMPLOYEES)会包含EID(员工唯一标识)、SALARY(薪资)、MANAGER_ID(该员工直接经理的EID)这几个核心字段。

常见错误原因

你之前没拿到数据,大概率是这几个问题:

  • 分组逻辑错误:按员工的EID分组了,而不是按经理的EID分组
  • 关联方式不对:用了INNER JOIN但部分经理没有下属,导致被过滤掉
  • 关联字段匹配错误:比如把员工的EID和经理的其他字段关联了

正确的SQL写法

1. 仅统计有下属的经理

如果只需要统计确实有下属的经理,用自连接+按经理ID分组:

SELECT 
    m.EID AS manager_eid,
    AVG(e.SALARY) AS avg_subordinate_salary
FROM 
    EMPLOYEES e
JOIN 
    EMPLOYEES m ON e.MANAGER_ID = m.EID
GROUP BY 
    m.EID;

这里把员工表拆成两个角色:e代表下属员工,m代表他们的经理,通过e.MANAGER_ID = m.EID关联,最后按经理的EID分组计算平均薪资。

2. 包含所有经理(即使没有下属)

如果需要把没有下属的经理也纳入统计(平均薪资显示为NULL),用LEFT JOIN:

SELECT 
    m.EID AS manager_eid,
    AVG(e.SALARY) AS avg_subordinate_salary
FROM 
    EMPLOYEES m
LEFT JOIN 
    EMPLOYEES e ON m.EID = e.MANAGER_ID
GROUP BY 
    m.EID;

要是想把NULL替换成0,用Oracle的NVL函数就行:

SELECT 
    m.EID AS manager_eid,
    NVL(AVG(e.SALARY), 0) AS avg_subordinate_salary
FROM 
    EMPLOYEES m
LEFT JOIN 
    EMPLOYEES e ON m.EID = e.MANAGER_ID
GROUP BY 
    m.EID;

适配你的表结构

如果你的表不是单表自关联(比如有单独的MANAGERS表),只需要调整关联逻辑:比如把EMPLOYEES m换成你的经理表,关联条件改成员工表的经理ID对应经理表的EID就行。

内容的提问来源于stack exchange,提问作者1forrest1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:08:37