首页 > 试题广场 >

统计出当前各个title类型对应的员工当前薪水对应的平均工资

[编程题]统计出当前各个title类型对应的员工当前薪水对应的平均工资
  • 热度指数:380096 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工职称表titles简况如下:
emp_no 
title
from_date 
to_date
10001
Senior Engineer 1986-06-26 9999-01-01
10003
Senior Engineer 2001-12-01
9999-01-01
10004
Senior Engineer 1995-12-01 9999-01-01
10006
Senior Engineer
2001-08-02
9999-01-01
10007
Senior Staff
1996-02-11 9999-01-01


有一个薪水表salaries简况如下:
emp_no 
salary
from_date 
to_date
10001
88958 1986-06-26
9999-01-01
10003
43311 2001-12-01
9999-01-01
10004
74057 1995-12-01 9999-01-01
10006
43311 2001-08-02 9999-01-01
10007 88070 2002-02-07 9999-01-01

请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:
title avg(s.salary)
Senior Engineer 62409.2500
Senior Staff
88070.0000
示例1

输入

drop table if exists  `salaries` ; 
drop table if exists  titles;
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 titles (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
INSERT INTO salaries VALUES(10001,88958,'1986-06-26','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'1995-12-01','9999-01-01');
INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');

INSERT INTO titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
INSERT INTO titles VALUES(10003,'Senior Engineer','2001-12-01','9999-01-01');
INSERT INTO titles VALUES(10004,'Senior Engineer','1995-12-01','9999-01-01');
INSERT INTO titles VALUES(10006,'Senior Engineer','2001-08-02','9999-01-01');
INSERT INTO titles VALUES(10007,'Senior Staff','1996-02-11','9999-01-01');

输出

Senior Engineer|62409.2500
Senior Staff|88070.0000
select title,avs
from (select title,avg(s.salary) as avs from titles t join salaries s on t.emp_no=s.emp_no group by t.title) as new
order by new.avs;
sql215
发表于 2025-02-18 12:28:29 回复(0)
select t.title,avg(s.salary) 
from titles t
inner join salaries s on t.emp_no=s.emp_no
group by t.title
order by avg(s.salary) asc

发表于 2024-09-03 16:47:29 回复(0)
select a.title,avg(b.salary) avg_sal
from titles a join salaries b on
a.emp_no = b.emp_no
group by title order by avg_sal
发表于 2024-08-10 17:34:37 回复(0)
select 
    t1.title
    ,avg(s.salary)  
from titles t1
    join salaries s on t1.emp_no=s.emp_no
where t1.to_date='9999-01-01' and s.to_date='9999-01-01'
group by t1.title

发表于 2024-07-19 22:08:40 回复(0)
select t1.title,
    round(avg(t2.salary),4) avg_sa
from titles t1 left join salaries t2
    on t1.emp_no = t2.emp_no
group by t1.title
order by avg_sa

发表于 2024-04-30 09:11:50 回复(0)
select a.title,avg(b.salary) salary from titles a
join salaries b
on a.emp_no=b.emp_no
group by a.title
order by salary;

编辑于 2024-02-05 21:48:56 回复(0)
select t.title, avg(s.salary) 
from titles t, salaries s
where t.emp_no = s.emp_no
group by t.title;
编辑于 2024-01-23 00:18:45 回复(0)
select t.title,avg(s.salary) from salaries s 
right join titles t on t.emp_no = s.emp_no 
group by t.title
order by avg(s.salary);

用left join 提交了好几遍就是不过,看了一会,发现salaries表有个员工没有职称,结果集里titile是null。
换个主表,用right join可以查出对应结果。
发表于 2023-11-15 16:25:57 回复(0)
select
title,avg(salary)
from titles
join salaries using(emp_no )
group by title
order by avg(salary)
发表于 2023-10-19 13:32:13 回复(0)
select 
 title, 
 avg(salary) as salary
from salaries t1 inner join titles t2 
on t1.emp_no = t2.emp_no
group by title
order by 2 

发表于 2023-09-06 11:05:59 回复(0)
select t.title, avg(s.salary) as avg_salary
from titles t
join salaries s
on t.emp_no = s.emp_no
group by t.title
order by avg_salary

发表于 2023-06-02 21:32:46 回复(0)
select distinct(e.title), avg(e.salary) from
(select title, salary from titles as t inner join salaries as s where t.emp_no = s.emp_no) as e group by e.title
发表于 2023-05-06 21:18:08 回复(0)
select title,avg(salary)
from titles t join salaries s on t.emp_no = s.emp_no
group by title

发表于 2023-04-30 23:38:00 回复(0)
select 
    title,
    avg(s.salary)
from 
    salaries s join titles t 
on 
    s.emp_no=t.emp_no 
group by 
    title 
order by 
    avg(s.salary) 

发表于 2022-12-07 11:52:00 回复(0)
# 这是个错误的答案,我想了好久才想明白,写在这里给各位提个醒
# 可以看到我这里用了聚合函数+开窗的操作,返回的答案如下:
Senior Engineer,65552.5000
Senior Engineer,65552.5000
Senior Engineer,65552.5000
Senior Engineer,65552.5000
Senior Staff,       75621.0000
# 这是因为partition by 1.只分区不去重 2.作为窗口函数,在from > …… > having > select之后执行 3. 这里是个avg()还不太明显,但如果是sum()会出现累加的结果
# 这题正确的写法是:不用开窗,直接group by title即可,对连接表分组去重,select avg()会对分组后的结果集进行聚合运算并汇总成一条数据

select 
    title,
    avg(salary)over(partition by title order by salary)
from titles
left join salaries
    on titles.emp_no = salaries.emp_no
发表于 2022-11-04 14:43:20 回复(0)
这题算简单的吧
SELECT title,AVG(s.salary) avg FROM titles t
LEFT JOIN salaries s
ON t.emp_no = s.emp_no
GROUP BY t.title 
ORDER BY avg


发表于 2022-09-22 08:47:34 回复(0)
select
  title,
  avg(salary) as 'avg(s.salary)'
from
  (
    select
      t.emp_no,
      title,
      salary
    from
      titles t
      join salaries s on t.emp_no = s.emp_no
  ) s
group by
  title
order by
  avg(s.salary)
发表于 2022-08-05 13:27:32 回复(0)
简简单单
SELECT a.title,avg(b.salary) FROM titles a JOIN salaries b on    a.emp_no = b.emp_no
GROUP BY a.title
ORDER BY AVG(b.salary);
发表于 2022-07-25 00:26:20 回复(0)
select
    ti.title,
    avg(s.salary)
from
    titles ti 
join
    salaries s 
on
    ti.emp_no = s.emp_no
group by
    ti.title
order by
    `avg(s.salary)`;
刷到的都是几年前的,有一样用mysql的吗

发表于 2022-07-07 13:19:34 回复(0)