SQL(10)--统计当前title员工当前薪水平均工资(分组)、获取所有部门当前员工当前薪水最高(分组)

本文介绍如何使用SQL进行员工薪资的统计分析,包括按职位计算平均薪资及各部门当前最高薪资的员工信息。通过联接多个表格,筛选出特定条件下的数据,进行聚合运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考点:avg() group by

一.统计当前title员工当前薪水平均工资

题目描述

统计出当前(titles.to_date='9999-01-01')各个title类型对应的员工当前(salaries.to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,

`to_date` date DEFAULT NULL);

输出描述

实现

select t.title,avg(s.salary) as avg
from titles as t,salaries as s 
on t.emp_no=s.emp_no
where t.to_date='9999-01-01'
and s.to_date='9999-01-01'
group by t.title

二.获取所有部门当前员工当前薪水最高

题目描述

获取所有部门中当前(dept_emp.to_date = '9999-01-01')员工当前(salaries.to_date='9999-01-01')薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输出描述

select d.dept_no,d.emp_no,max(s.salary)
from dept_emp as d inner join salaries as s 
on d.emp_no=s.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
group by dept_no

 

### 查询每个职位类型对应的员工当前薪水平均工资 为了查询每个职位类型(`title`)对应的员工当前薪水平均工资,可以使用SQL中的 `JOIN` 操作将 `titles` 和 `salaries` 连接起来,并筛选出当前有效的薪水记录(即 `to_date = '9999-01-01'`)。之后,通过 `GROUP BY` 对不同的 `title` 类型进行分组,并计算每种类型的平均工资。 以下是实现该功能的SQL代码: ```sql SELECT t.title, AVG(s.salary) AS avg_salary FROM titles t LEFT JOIN salaries s ON t.emp_no = s.emp_no WHERE t.to_date = '9999-01-01' AND s.to_date = '9999-01-01' GROUP BY t.title ORDER BY avg_salary ASC; ``` #### 代码解析 1. **连接**:通过 `LEFT JOIN` 将 `titles` 与 `salaries` 连接起来,条件是两的 `emp_no` 字段相等[^3]。 2. **筛选当前有效记录**:使用 `WHERE` 子句过滤出 `titles` 和 `salaries` 中 `to_date = '9999-01-01'` 的记录,这示这些记录在当前时间范围内仍然有效。 3. **分组与聚合**:通过 `GROUP BY t.title` 对不同 `title` 类型的数据进行分组,并使用 `AVG(s.salary)` 计算每个职位类型的平均工资[^3]。 4. **排序**:通过 `ORDER BY avg_salary ASC` 按照平均工资升序排列结果[^3]。 #### 示例输出 假设数据如下: - `titles` : | emp_no | title | from_date | to_date | |--------|-----------------|-----------|---------------| | 1001 | Senior Engineer | 2000-01-01| 9999-01-01 | | 1002 | Senior Staff | 2000-01-01| 9999-01-01 | - `salaries` : | emp_no | salary | from_date | to_date | |--------|--------|-----------|---------------| | 1001 | 62409 | 2000-01-01| 9999-01-01 | | 1002 | 88070 | 2000-01-01| 9999-01-01 | 执行上述SQL后,结果为: | title | avg_salary | |-----------------|------------| | Senior Engineer | 62409.25 | | Senior Staff | 88070.00 | #### 注意事项 - 确保 `titles` 和 `salaries` 中 `to_date = '9999-01-01'` 的记录代当前有效的职位和薪水信息。 - 如果存在某些职位没有对应的薪水记录,则可以通过 `LEFT JOIN` 确保这些职位仍然出现在结果中,但其平均工资值为 `NULL`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值