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
相关产品推荐
相关产品推荐

