Manager Effectiveness — Team Metrics Rollup

Manager Effectiveness — Team Metrics Rollup

A manager's effectiveness shows in their team's metrics: retention rate, average performance rating, salary growth, and team size stability. This query aggregates all of those into a manager scorecard.

-- Manager scorecard: retention, ratings, compensation growth
WITH direct_reports AS (
    SELECT
        manager_id,
        COUNT(*)                                                    AS team_size,
        COUNT(*) FILTER (WHERE NOT is_active)                       AS terminated,
        AVG(EXTRACT(EPOCH FROM AGE(
            COALESCE(termination_date, CURRENT_DATE), hire_date
        )) / 2592000)                                               AS avg_tenure_months
    FROM hr_employees
    WHERE manager_id IS NOT NULL
    GROUP BY manager_id
),
team_ratings AS (
    SELECT
        e.manager_id,
        ROUND((AVG(pr.rating::numeric))::NUMERIC, 2)                           AS avg_team_rating,
        COUNT(DISTINCT pr.employee_id)                              AS rated_employees
    FROM hr_performance_reviews pr
    JOIN hr_employees e ON e.id = pr.employee_id
    WHERE pr.review_year = 2024
      AND e.manager_id IS NOT NULL
    GROUP BY e.manager_id
),
team_comp AS (
    SELECT manager_id, AVG(salary_usd) AS avg_team_salary
    FROM (
        SELECT e.manager_id, s.salary_usd,
            ROW_NUMBER() OVER (PARTITION BY e.id ORDER BY s.effective_date DESC) AS rn
        FROM hr_employees e
        JOIN hr_salaries s ON s.employee_id = e.id
        WHERE e.is_active
    ) latest
    WHERE rn = 1
    GROUP BY manager_id
)
SELECT
    m.emp_id,
    m.name                                                         AS manager,
    d.name                                                         AS department,
    jl.level_code,
    dr.team_size,
    dr.terminated                                                  AS team_terminations,
    ROUND(100.0 * dr.terminated / NULLIF(dr.team_size, 0), 1)     AS team_attrition_pct,
    ROUND(dr.avg_tenure_months, 1)                                 AS avg_tenure_months,
    tr.avg_team_rating,
    ROUND(tc.avg_team_salary)                                      AS avg_team_salary_usd
FROM direct_reports dr
JOIN hr_employees m    ON m.id = dr.manager_id
JOIN hr_departments d  ON d.id = m.dept_id
JOIN hr_job_levels jl  ON jl.id = m.job_level_id
LEFT JOIN team_ratings tr               ON tr.manager_id = dr.manager_id
LEFT JOIN team_comp tc                  ON tc.manager_id = dr.manager_id
WHERE m.is_active
ORDER BY team_attrition_pct DESC
LIMIT 20;

Purchase this course to unlock the full lesson.

Sign up