SQL Server查询需求:统计经理下属总数及完成年度评审员工数
解决SQL Server中经理下属统计问题
问题核心
原查询的两个关键问题:
- 使用
INNER JOIN导致无评论记录的经理被排除; - 统计下属总数时错误关联评论表,仅统计了有评论的下属,而非所有活跃下属。
优化后的查询方案
假设你的表结构如下(字段名可根据实际情况替换):
employee表:emp_id(员工ID)、name(员工姓名)、manager_id(直属经理ID)、is_active(是否活跃,1=活跃)comments表:emp_id(被评论员工ID)、comment_type_id(评论类型)、comment_date(评论日期)、manager_id(提交评论的经理ID)
SELECT m.emp_id AS manager_id, m.name AS manager_name, -- 统计活跃下属总数,无下属时显示0 COALESCE(sub.total_active_subordinates, 0) AS total_active_subordinates, -- 统计指定日期后提交REVIEW评论的下属数,无评论时显示0 COALESCE(rev.reviewed_subordinates, 0) AS reviewed_subordinates_count FROM -- 筛选所有存在下属的经理 (SELECT DISTINCT emp_id, name FROM employee WHERE EXISTS (SELECT 1 FROM employee sub WHERE sub.manager_id = employee.emp_id)) m -- 左连接统计活跃下属的子查询 LEFT JOIN (SELECT manager_id, COUNT(emp_id) AS total_active_subordinates FROM employee WHERE is_active = 1 GROUP BY manager_id) sub ON sub.manager_id = m.emp_id -- 左连接统计符合条件评论的子查询 LEFT JOIN (SELECT manager_id, COUNT(DISTINCT emp_id) AS reviewed_subordinates FROM comments WHERE comment_type_id = 'REVIEW' AND comment_date > '2023-01-01' -- 替换为你的指定日期 GROUP BY manager_id) rev ON rev.manager_id = m.emp_id ORDER BY m.emp_id;
关键优化说明
- 保留所有经理:用
LEFT JOIN替代INNER JOIN,确保无评论记录的经理也能出现在结果中;通过EXISTS精准筛选有下属的经理。 - 准确统计活跃下属:单独从
employee表统计活跃下属,避免与评论表连接导致的重复计数。 - 去重统计评论下属:用
COUNT(DISTINCT emp_id)避免同一下属多次被评论时重复计数。 - 处理空值:用
COALESCE将无下属/无评论的情况显示为0,避免结果出现NULL。
适配comments表无manager_id的情况
如果comments表未直接存储经理ID,需通过employee表关联获取:
-- 调整评论统计子查询 LEFT JOIN (SELECT sub.manager_id, COUNT(DISTINCT c.emp_id) AS reviewed_subordinates FROM comments c JOIN employee sub ON c.emp_id = sub.emp_id WHERE c.comment_type_id = 'REVIEW' AND c.comment_date > '2023-01-01' GROUP BY sub.manager_id) rev ON rev.manager_id = m.emp_id
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

