如何在主查询中使用SELECT子查询返回值统计各绩效加权平均区间员工数
SQL实现方案
你可以通过CTE(公共表表达式)先计算每名员工的加权平均值,再手动构造需要统计的区间集合,通过左关联保证0人数的区间也能正常展示,完整单条查询语句如下:
WITH emp_weighted_avg AS ( -- 计算每名员工的绩效加权平均值,沿用你已有的逻辑 SELECT emp_id, SUM(weightage * achievement) / SUM(weightage) AS weighted_avg_emp FROM table_name GROUP BY emp_id ), performance_ranges AS ( -- 构造所有需要展示的统计区间,确保0人数区间不会丢失 SELECT '0-25' AS range_of_weighted_average, 0 AS lower_bound, 25 AS upper_bound UNION ALL SELECT '25-50' AS range_of_weighted_average, 25 AS lower_bound, 50 AS upper_bound UNION ALL SELECT '50-75' AS range_of_weighted_average, 50 AS lower_bound, 75 AS upper_bound UNION ALL SELECT '75-100' AS range_of_weighted_average, 75 AS lower_bound, 100 AS upper_bound ) -- 关联统计各区间员工人数 SELECT pr.range_of_weighted_average, COUNT(ewa.emp_id) AS `no.of_employees` FROM performance_ranges pr LEFT JOIN emp_weighted_avg ewa ON ewa.weighted_avg_emp >= pr.lower_bound AND ewa.weighted_avg_emp < pr.upper_bound GROUP BY pr.range_of_weighted_average, pr.lower_bound ORDER BY pr.lower_bound;
逻辑说明
- 第一层CTE
emp_weighted_avg直接复用了你已有的员工加权平均计算逻辑,无需修改 - 第二层CTE
performance_ranges手动生成了四个目标区间,避免直接分组统计时0人数区间被过滤的问题 - 最后通过区间表左关联员工加权平均结果,匹配落在对应区间的员工,用
COUNT(ewa.emp_id)统计人数,无匹配员工的区间会自动返回0,完全匹配你需要的输出结果。
如果你使用的数据库不支持CTE语法,也可以把子查询直接写到FROM子句里,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

