MySQL表关联与函数使用求助:基于测试员工库的3个查询实现
MySQL表关联与聚合函数实战解答
现有代码问题说明
- 需求1现有代码未关联员工表筛选出生日期,也未做去重处理,同一个员工多条职位记录会被重复统计
- 需求2现有代码统计的是各部门平均薪资,而非要求的各职位平均薪资,关联的表对象错误
各需求正确实现与逻辑说明
需求1:统计1965-01-01之后出生的每个职位对应的员工数量
SELECT t.title, COUNT(DISTINCT t.emp_no) AS `Number Of Employees` FROM titles t INNER JOIN employees e ON t.emp_no = e.emp_no WHERE e.birth_date > '1965-01-01' GROUP BY t.title;
- 关联职位表
titles和员工信息表employees,关联键为员工编号emp_no - 用
WHERE子句筛选出生日期符合要求的员工 COUNT(DISTINCT emp_no)避免同一员工多段职位任职记录被重复计数- 按职位字段
title分组输出结果
需求2:统计每个职位对应的平均薪资
SELECT t.title, AVG(s.salary) AS `Average Salary` FROM titles t INNER JOIN salaries s ON t.emp_no = s.emp_no -- 可选补充时间匹配条件,避免员工历史职位和当前薪资错配: -- WHERE s.from_date BETWEEN t.from_date AND t.to_date GROUP BY t.title;
- 关联职位表
titles和薪资表salaries,关联键为员工编号emp_no - 用聚合函数
AVG()计算每个分组的薪资平均值 - 按职位字段
title分组输出结果
需求3:统计1990年至1992年期间,市场部的薪资总支出
SELECT SUM(s.salary) AS `Total Salary Expenditure` FROM departments d INNER JOIN dept_emp de ON d.dept_no = de.dept_no INNER JOIN salaries s ON de.emp_no = s.emp_no WHERE d.dept_name = 'Marketing' AND s.from_date >= '1990-01-01' AND s.to_date <= '1992-12-31';
- 依次关联部门表
departments、员工部门映射表dept_emp、薪资表salaries - 第一层筛选部门名称为市场部,第二层筛选薪资发放时间落在1990-1992年范围内
- 用聚合函数
SUM()汇总所有符合条件的薪资记录,得到总支出金额
内容的提问来源于stack exchange,提问作者user14343607
相关产品推荐
相关产品推荐

