首页 > 试题广场 >

统计各个部门的工资记录数

[编程题]统计各个部门的工资记录数
  • 热度指数:348578 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个部门表departments简况如下:
dept_no dept_name
d001 Marketing
d002
Finance


有一个,部门员工关系表dept_emp简况如下:
emp_no
dept_no 
from_date 
to_date
10001 d001
2001-06-22 9999-01-01
10002 d001
1996-08-03 9999-01-01
10003 d002
1996-08-03 9999-01-01

有一个薪水表salaries简况如下:
emp_no 
salary
from_date 
to_date
10001
85097 2001-06-22
2002-06-22
10001 88958 2002-06-22 9999-01-01
10002
72527 1996-08-03
9999-01-01
10003
32323 1996-08-03 9999-01-01


请你统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum,按照dept_no升序排序,以上例子输出如下:
dept_no dept_name sum
d001 Marketing 3
d002 Finance 1
示例1

输入

drop table if exists  `departments` ; 
drop table if exists  `dept_emp` ; 
drop table if exists  `salaries` ; 
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
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`));
INSERT INTO departments VALUES('d001','Marketing');
INSERT INTO departments VALUES('d002','Finance');
INSERT INTO dept_emp VALUES(10001,'d001','2001-06-22','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1996-08-03','9999-01-01');
INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','9999-01-01');
INSERT INTO salaries VALUES(10003,32323,'1996-08-03','9999-01-01');

输出

d001|Marketing|3
d002|Finance|1
select dept_no,
       dept_name,
       count(*) as sum
from departments d
join dept_emp de
using(dept_no ) 
join salaries s
using(emp_no)
group by d.dept_no,d.dept_name

编辑于 2024-04-14 13:34:19 回复(0)
select d.dept_no,d.dept_name,count(s.salary) as sum
from departments as d
join dept_emp as de
on d.dept_no = de.dept_no
join salaries as s
on de.emp_no = s.emp_no
group by d.dept_no
order by d.dept_no asc
编辑于 2024-04-14 12:54:31 回复(0)
select departments.dept_no, departments.dept_name, count(departments.dept_no)
from departments,
     dept_emp,
     salaries
where departments.dept_no = dept_emp.dept_no
  and dept_emp.emp_no = salaries.emp_no
group by departments.dept_no
order by dept_no

编辑于 2024-03-24 21:28:00 回复(0)
select d.dept_no,d.dept_name,count(s.salary) sum from salaries s join (select d1.dept_no,d2.dept_name,d1.emp_no from dept_emp d1 join departments d2 on d1.dept_no=d2.dept_no) d
on s.emp_no=d.emp_no
group by d.dept_no
order by d.dept_no asc

编辑于 2024-03-08 20:21:30 回复(0)
表有问题,可以自己复制SQL到数据库做
select de.dept_no dept_no ,dep.dept_name ,count(de.dept_no) sum  from dept_emp de left join salaries s on de.emp_no = s.emp_no left join departments dep on dep.dept_no = de.dept_no group by de.dept_no order by dept_no

编辑于 2024-02-29 10:23:18 回复(0)
select a.*,count(c.salary) sum from departments a
join dept_emp b
on a.dept_no=b.dept_no
join salaries c
on b.emp_no=c.emp_no
group by a.dept_no
order by a.dept_no;

编辑于 2024-02-05 22:01:07 回复(0)
select d.dept_no,d.dept_name,count(s.salary)
from departments d,dept_emp de,salaries s
where d.dept_no = de.dept_no and s.emp_no = de.emp_no
group by d.dept_no
order by d.dept_no;
编辑于 2024-01-23 01:40:10 回复(0)
select d.dept_no, d.dept_name, count(s.emp_no)
from departments d inner join dept_emp p
on d.dept_no = p.dept_no
inner join salaries s
on p.emp_no = s.emp_no
group by d.dept_no
order by d.dept_no
发表于 2024-01-12 16:13:03 回复(0)
select
    departments.dept_no,
    departments.dept_name,
    count(salaries.salary) as sum
from
    departments
    left join dept_emp on departments.dept_no = dept_emp.dept_no
    join salaries on dept_emp.emp_no = salaries.emp_no
group by
    departments.dept_no
order by
    departments.dept_no

发表于 2023-10-11 21:38:08 回复(0)
SELECT
    d.dept_no,
    d.dept_name,
    count(s.emp_no) as sum
from
    dept_emp de
    inner join departments d on de.dept_no = d.dept_no
    inner join salaries s on de.emp_no = s.emp_no
group by
    d.dept_no,
    d.dept_name
order by
    d.dept_no

发表于 2023-09-28 14:17:18 回复(0)
select t1.dept_no,dept_name, sum
from departments
inner join(
select dept_no, count(*) sum
from dept_emp
inner join salaries
on dept_emp.emp_no=salaries.emp_no
group by dept_no) t1
on t1.dept_no=departments.dept_no
这么写避免了group by的问题,先统计每个部门一共多少行,再匹配部门名称
发表于 2023-09-19 00:09:20 回复(0)
请看VCR:
select
    emp.dept_no as deptno,
    ( select
            dept_name
        from
            departments as d
        where
            d.dept_no = emp.dept_no
    ) as deptname,
    count(sal.salary) as sum
from
    salaries as sal
    join dept_emp as emp on emp.emp_no = sal.emp_no
group by
    deptno
order by
    emp.dept_no asc;


发表于 2023-09-16 18:35:11 回复(0)
# 请你统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum,按照dept_no升序排序,以上例子

select 
 t2.dept_no,
 t3.dept_name,
 count(t1.emp_no) as sum
from salaries t1 
inner join dept_emp t2
on t1.emp_no = t2.emp_no
inner join departments t3
on t2.dept_no = t3.dept_no
group by t2.dept_no,t3.dept_name
order by 1


发表于 2023-09-08 10:52:51 回复(0)
SELECT d.dept_no,d.dept_name,COUNT(k.salary) AS sum
FROM departments AS d
LEFT JOIN 
(SELECT dept.dept_no,s.salary
FROM dept_emp AS dept
LEFT JOIN salaries AS s
ON s.emp_no = dept.emp_no) AS k
ON d.dept_no = k.dept_no
GROUP BY d.dept_no

发表于 2023-07-26 17:18:12 回复(0)
select dm.dept_no, dm.dept_name, count(*) as sum
from salaries s
left join dept_emp de on de.emp_no = s.emp_no
left join departments dm on dm.dept_no = de.dept_no
group by dm.dept_no
order by dept_no;
发表于 2023-07-08 20:13:38 回复(0)
select d.dept_no, d.dept_name, count(d.emp_no)
from (
    select t1.dept_name, t2.emp_no, t2.dept_no
    from departments t1
    join dept_emp t2
    on t1.dept_no = t2.dept_no
) d
join salaries s
on d.emp_no = s.emp_no
group by d.dept_no
order by d.dept_no

发表于 2023-06-06 21:24:18 回复(0)
select t2.dept_no,c.dept_name,t2.sum from (select dept_no,count(emp_no)as sum from (select a.emp_no,b.dept_no from salaries a left join dept_emp b on a.emp_no=b.emp_no) t1 group by dept_no)t2 left join departments c on t2.dept_no=c.dept_no
为啥不能用left join 要用inner join
发表于 2023-05-31 10:56:29 回复(0)
select
  t2.dept_no as dept_no,
  dept_name,
  t2.sum2 as sum
from
  departments
  inner join (
    select
      distinct dept_emp.dept_no,
      sum(t1.sum1) as sum2
    from
      dept_emp
      left join (
        select
          distinct emp_no,
          count(salary) as sum1
        from
          salaries
        group by
          emp_no
      ) as t1 on dept_emp.emp_no = t1.emp_no
    group by
      dept_no
  ) as t2 on t2.dept_no = departments.dept_no
多次尝试,瞎蒙而过,穷举法有时候还是有用。
发表于 2023-01-17 14:01:03 回复(0)
解法思路:
思路:用两次left join 保证每个员工都可以匹配到部门名字
关键:怎么求部门工资记录数呢,这里用count函数统计部门名字作为sum
总结此题最关键的地方怎么统计部门工资记录
select d.dept_no,d.dept_name,count(d.dept_name) as sum 
from 
(salaries s left join dept_emp de on s.emp_no=de.emp_no
left join departments d on d.dept_no=de.dept_no)
group by d.dept_no
order by d.dept_no


发表于 2023-01-07 20:10:20 回复(0)
select dept_no,dept_name,count(1) as 'sum'
from departments left join dept_emp using(dept_no)
left join salaries using(emp_no)
group by dept_no;

发表于 2022-12-22 10:01:54 回复(0)