首页 > 试题广场 >

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

[编程题]统计各个部门的工资记录数
  • 热度指数:375086 时间限制: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 de.dept_no,de.dept_name,COUNT(de.dept_no) sum
FROM (SELECT s.emp_no,s.salary,d.dept_no FROM salaries s LEFT JOIN dept_emp d ON s.emp_no=d.emp_no) n
LEFT JOIN departments de ON de.dept_no=n.dept_no
GROUP BY de.dept_no,de.dept_name
ORDER BY de.dept_no

发表于 2025-05-13 11:56:58 回复(0)
有无大佬帮忙看看,这段代码错在哪里?自测运行能通过,提交无法通过,但是显示的答案没错。
select
    a.dept_no,
    a.dept_name,
    count(a.salary) sum
from
    (
        select
            de.emp_no,
            d.dept_no,
            d.dept_name,
            s.salary,
            s.from_date,
            s.to_date
        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
        where
            de.to_date = '9999-01-01'
    ) a
group by
    a.dept_no
order by
    a.dept_no;
发表于 2025-02-25 10:57:58 回复(0)
select
t1.dept_no, t1.dept_name, count(t23.salary) as sum
from departments t1 left join
(
select
t2.dept_no, t3.salary
from dept_emp t2 left join salaries t3
on t2.emp_no=t3.emp_no
) t23

on t1.dept_no=t23.dept_no

group by t1.dept_no
;
发表于 2025-02-25 10:30:24 回复(0)
select
    t.dept_no,
    t.dept_name,
    count(t.dept_no) as sum
from salaries as s
left join (
    select
        d.dept_name,
        de.emp_no,
        d.dept_no
    from departments as d
    left join dept_emp as de
    on d.dept_no = de.dept_no
) as t
on s.emp_no = t.emp_no 
group by dept_no
order by dept_no asc

发表于 2025-01-11 16:41:10 回复(0)
select
    temp1.dept_no,
    temp2.dept_name,
    temp1.sum
from
    (
        select
            d.dept_no dept_no,
            count(d.emp_no) sum
        from
            dept_emp d
            left join salaries s on d.emp_no = s.emp_no
        group by
            d.dept_no
    ) temp1 inner join departments temp2 on temp1.dept_no = temp2.dept_no
order by temp1.dept_no asc;

发表于 2025-01-03 15:20:19 回复(0)
select dept_no, dept_name ,count(*) sum
from dept_emp
join salaries using(emp_no)
join departments using(dept_no)
group by dept_no, dept_name
order by dept_no

发表于 2024-12-27 18:41:58 回复(1)
为什么不能用Group by dept_name呢?
发表于 2024-10-24 18:15:20 回复(0)
select dp.dept_no, ds.dept_name, count(salary) as sum
from dept_emp dp right join salaries s on dp.emp_no = s.emp_no
inner join departments ds on dp.dept_no = ds.dept_no
group by dp.dept_no
order by dp.dept_no asc
发表于 2024-10-22 15:40:59 回复(0)
select departments.dept_no,departments.dept_name,sum(ta2.c) as sum
from departments
right join(
    select dept_emp.emp_no,dept_emp.dept_no,ta1.c
    from dept_emp
    inner join(
        select salaries.emp_no,count(emp_no) as c
        from salaries
        group by emp_no
    ) ta1
    on ta1.emp_no=dept_emp.emp_no
) ta2
on departments.dept_no=ta2.dept_no
group by dept_no
order by dept_no
发表于 2024-10-16 10:35:45 回复(0)
为什么可以只用
group by da.dept_no
不能只用
group by da.dept_name
发表于 2024-09-08 18:18:59 回复(0)
新人小白第一次做这个题的一些解题想法,勿喷~

看题意 第一想法就是三表连接,首先salaries表连接dept_emp表想得到题意中的计数sum,再与departments连接得到dept_name
由于有计数,所以肯定要有分组依据group by,我使用的是dept_emp表的dept_no。最后需要根据dept_no进行升序排序

SELECT de.dept_no,dept_name,count(de.dept_no) as sum 
FROM salaries s 
left JOIN dept_emp de ON de.emp_no = s.emp_no 
left join departments d on d.dept_no = de.dept_no
group by de.dept_no
order by dept_no asc 
发表于 2024-08-23 14:20:18 回复(0)
select d.*, q.sum sum
from departments d
left join
(select de.dept_no dept_no, count(de.dept_no) sum
from dept_emp de
right join salaries s
on de.emp_no = s.emp_no
group by de.dept_no) q

on d.dept_no = q.dept_no
order by d.dept_no;

##------------------------注意点-------------------------------

##一个聚合字段d.dept_no一般对应一个d.dept_name(一个部门id对应一个部门名称),所以select d.dept_no, d.dept_name, count(s.salary) sum是行得通的。
##如果一个聚合字段d.dept_no对应多个,比如假设有d.emp_no字段(一个部门id对应多个员工)。要同时提出d.dept_no, count(s.salary) sum和最高薪资的那名员工id,d.emp_no就不能直接放在select语句中了。
发表于 2024-07-15 17:00:30 回复(0)
select 
y.dept_no
,dept_name
,sum
from (
    select  
    dept_no  
    ,count(dept_no) as sum
    from dept_emp as a
    join salaries as b
    on a.emp_no=b.emp_no
    group by dept_no
    ) as x
right join departments as y
on x.dept_no=y.dept_no
order by y.dept_no

发表于 2024-07-09 18:38:18 回复(0)

第一次尝试逗号连接。

select
    d.dept_no,
    d.dept_name,
    count(*) sum
from departments d,dept_emp de,salaries s
where d.dept_no=de.dept_no and de.emp_no=s.emp_no
group by d.dept_no,d.dept_name
order by d.dept_no;
发表于 2024-06-05 00:48:41 回复(0)
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)

问题信息

SQL
难度:
191条回答 32855浏览

热门推荐

通过挑战的用户

查看代码
统计各个部门的工资记录数