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

SQL技术需求:计算分数区间内员工平均满意度及晋升人数统计

嘿,我来帮你搞定这个SQL问题!你已经有了分数区间统计的基础框架,接下来只要在这个基础上扩展数学运算,再关联Employee表的晋升和满意度数据就行,分两步来:

1. 给分数区间加数学运算

你现有的区间统计已经能算出每个分数段的员工数,要做数学运算的话,无非是基于这个数做比例计算,或者聚合该区间内员工的其他指标。举几个实用的例子:

  • 计算区间员工占总人数的百分比:用区间内的员工数除以总员工数,注意要转成浮点型避免整数除法(比如乘以100.0)。
  • 计算区间内员工的平均满意度:直接用AVG()函数聚合Employee表的满意度字段。
  • 对比晋升/未晋升员工在区间的分布:用条件聚合来分别统计两类员工的数量。

先给你补全基础的区间运算查询(假设用CASE定义分数区间):

SELECT 
    t.score_range AS ScoreRange,
    COUNT(t.employee_id) AS EmployeeCount,
    -- 计算该区间员工占总员工数的百分比
    ROUND(COUNT(t.employee_id) * 100.0 / (SELECT COUNT(*) FROM Employee), 2) AS PercentageOfTotal,
    -- 计算该区间员工的平均满意度
    AVG(e.satisfaction_score) AS AvgSatisfaction
FROM (
    SELECT 
        ev.employee_id,
        CASE 
            WHEN ev.evaluation_score BETWEEN 0 AND 1 THEN '0-1'
            WHEN ev.evaluation_score BETWEEN 1 AND 2 THEN '1-2'
            WHEN ev.evaluation_score BETWEEN 2 AND 3 THEN '2-3'
            -- 按需补充其他分数区间
            ELSE '9-10'
        END AS score_range
    FROM evaluation ev
) t
JOIN Employee e ON t.employee_id = e.employee_id
GROUP BY t.score_range
ORDER BY t.score_range;
2. 关联近5年晋升/未晋升数据

要结合晋升数据,需要把evaluation和Employee表通过employee_id关联,同时筛选近5年的记录:

  • 已晋升员工:筛选promotion_date在近5年内(不同数据库日期函数有差异,下面用SQL Server的写法,MySQL可以换TIMESTAMPDIFF(YEAR, promotion_date, NOW()) <=5)。
  • 未晋升员工:筛选promotion_date IS NULL或者从未晋升的标记。

如果要分别统计两类员工在各区间的数量和满意度,可以用条件聚合:

SELECT 
    t.score_range AS ScoreRange,
    COUNT(t.employee_id) AS TotalInRange,
    -- 统计近5年晋升的员工数
    SUM(CASE WHEN DATEDIFF(YEAR, e.promotion_date, GETDATE()) <=5 THEN 1 ELSE 0 END) AS PromotedCount,
    -- 统计未晋升的员工数
    SUM(CASE WHEN e.promotion_date IS NULL THEN 1 ELSE 0 END) AS NonPromotedCount,
    -- 晋升员工的平均满意度
    AVG(CASE WHEN DATEDIFF(YEAR, e.promotion_date, GETDATE()) <=5 THEN e.satisfaction_score ELSE NULL END) AS PromotedAvgSatisfaction,
    -- 未晋升员工的平均满意度
    AVG(CASE WHEN e.promotion_date IS NULL THEN e.satisfaction_score ELSE NULL END) AS NonPromotedAvgSatisfaction
FROM (
    SELECT 
        ev.employee_id,
        CASE 
            WHEN ev.evaluation_score BETWEEN 0 AND 1 THEN '0-1'
            WHEN ev.evaluation_score BETWEEN 1 AND 2 THEN '1-2'
            -- 按需补充区间
            ELSE '9-10'
        END AS score_range
    FROM evaluation ev
) t
JOIN Employee e ON t.employee_id = e.employee_id
GROUP BY t.score_range
ORDER BY t.score_range;
小提醒
  • 不同数据库的日期函数不一样,比如PostgreSQL用AGE(promotion_date) <= INTERVAL '5 years',Oracle用MONTHS_BETWEEN(SYSDATE, promotion_date)/12 <=5,记得根据你的数据库调整。
  • 如果你的区间是用临时表/CTE生成的,逻辑也是一样的——在最终的SELECT里加入需要的聚合或运算就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:31:29