首页 > 试题广场 >

汇总各个部门当前员工的title类型的分配数目

[编程题]汇总各个部门当前员工的title类型的分配数目
  • 热度指数:337194 时间限制: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
1986-06-26 9999-01-01
10002 d001
1996-08-03 9999-01-01
10003 d002 1995-12-03 9999-01-01


有一个职称表titles简况如下:
emp_no title form_date to_date
10001 Senior Engineer 1986-06-26 9999-01-01
10002
Staff 1996-08-03 9999-01-01
10003
Senior Engineer
1995-12-03 9999-01-01


汇总各个部门当前员工的title类型的分配数目,即结果给出部门编号dept_no、dept_name、其部门下所有的员工的title以及该类型title对应的数目count,结果按照dept_no升序排序,dept_no一样的再按title升序排序
dept_no
dept_name
title count
d001
Marketing
Senior  Engineer 1
d001
Marketing
Staff 1
d002
Finance
Senior  Engineer
1

示例1

输入

drop table if exists  `departments` ; 
drop table if exists  `dept_emp` ; 
drop table if exists  titles ;
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 titles (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
INSERT INTO departments VALUES('d001','Marketing');
INSERT INTO departments VALUES('d002','Finance');
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1995-12-03','9999-01-01');
INSERT INTO titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
INSERT INTO titles VALUES(10002,'Staff','1996-08-03','9999-01-01');
INSERT INTO titles VALUES(10003,'Senior Engineer','1995-12-03','9999-01-01');

输出

d001|Marketing|Senior Engineer|1
d001|Marketing|Staff|1
d002|Finance|Senior Engineer|1
with
    merge_tab as (
        select
        distinct t3.dept_no,
            t3.dept_name,
            t1.title,
            count(t1.emp_no) over (
                partition by
                    t3.dept_no,
                    t1.title
            ) as count
        from
            titles t1
            join dept_emp t2 on t1.emp_no = t2.emp_no
            join departments t3 on t2.dept_no = t3.dept_no
    )select  * from merge_tab order by dept_no,title

发表于 2026-04-04 11:09:50 回复(0)
解题记录:
select d.dept_no,dept_name,title,count(title)  --计算每个部门每个职称有多少人
from departments d
join dept_emp e
using (dept_no)
join titles
using (emp_no)
group by d.dept_no,title --先按每个部门进行分组,再按每个职称分组
order by d.dept_no,title

发表于 2026-02-15 23:06:26 回复(0)
select 
x.dept_no
,x.dept_name
,title 
,count(*) as count 
from departments x 
join dept_emp y 
on x.dept_no=y.dept_no
join titles z 
on y.emp_no=z.emp_no
group by 1,2,3
order by 1,3

发表于 2025-10-15 12:09:12 回复(0)
select
    dp.dept_no,
    dp.dept_name,
    t.title,
    count(t.title) as count
from
    departments as dp
    inner join dept_emp as de on dp.dept_no = de.dept_no
    inner join titles as t on t.emp_no = de.emp_no
    and de.to_date = t.to_date
group by
    dp.dept_no,
    t.title
order by
    dept_no ASC,
    title ASC;

发表于 2025-09-24 18:41:32 回复(0)
with
    hh as (
        select
            de.dept_no as hdept_no,
            tt.title,
            count(distinct de.dept_no) as count
        from
            dept_emp de
            join titles tt on de.emp_no = tt.emp_no
        group by
            de.dept_no,
            tt.title
    )
select
    a.dept_no,
    a.dept_name,
    c.title,
    hh.count
from
    departments a
    join dept_emp b on a.dept_no = b.dept_no
    join titles c on b.emp_no = c.emp_no
    join hh on a.dept_no = hh.hdept_no
    and c.title = hh.title
order by
    a.dept_no,
    c.title
发表于 2025-08-05 15:50:30 回复(0)
select a.dept_no, a.dept_name, c.title, count(b.emp_no) as count
from departments a
join dept_emp b on a.dept_no = b.dept_no
join titles c on b.emp_no = c.emp_no
where b.to_date = "9999-01-01" and c.to_date = "9999-01-01"
group by a.dept_no, a.dept_name, c.title
order by dept_no, title
1、三表相连。join
2、过滤出在职员工。where
3、按部门编号、部门名称[部门编号和部门名称一一对应,属于多余,仅为了保留该字段]、职称类型,进行分组。group by
4、按要求对结果排序。order by
发表于 2025-08-01 18:08:03 回复(0)
select d.dept_no,d.dept_name,t.title,count(*)as count

from departments as d,dept_emp as de,titles as t

where d.dept_no=de.dept_no and t.emp_no = de.emp_no

group by d.dept_no,d.dept_name,t.title
发表于 2025-05-01 23:56:59 回复(0)
select a.dept_no,c.dept_name,b.title, count(b.title) as`count`
from dept_emp a
left join titles b
on a.emp_no=b.emp_no
left join departments c
on a. dept_no= c. dept_no
where a.to_date='9999-01-01' and b.to_date='9999-01-01'
group by a.dept_no, b.title
order by a.dept_no, b.title
发表于 2025-04-09 16:03:40 回复(0)
真拉低智商
with
    k as (
        select
            a.dept_no,
            dept_name,
            title,
            count(title)
        from
            dept_emp a
            left join departments b on a.dept_no = b.dept_no
            left join titles c on c.emp_no = a.emp_no
        group by a.dept_no,dept_name, title
        order by a.dept_no,title
    ) 
    select * from k

发表于 2025-04-02 13:49:58 回复(0)
SELECT
    d.dept_no,
    d.dept_name,
    t.title,
    COUNT(t.emp_no) AS count
FROM
dept_emp AS de
JOIN titles AS t ON de.emp_no = t.emp_no
JOIN departments AS d ON d.dept_no = de.dept_no
GROUP BY d.dept_no,d.dept_name,t.title
ORDER BY d.dept_no

发表于 2025-02-26 14:58:25 回复(0)
select
*
,count(title) count
from
(
select 
de.dept_no dno
,dept_name
,title
from 
dept_emp de
left join
titles t
on de.emp_no=t.emp_no
left join departments d
on de.dept_no=d.dept_no
) zi1
group by dno,title
order by dno,title

发表于 2025-02-08 12:22:25 回复(0)

select

dept_no, dept_name, title

,count(*) as count

from titles

left join dept_emp using(emp_no)

left join departments using(dept_no)

group by 1, 2, 3

order by 1, 3

怎么就过了,困难题?
是不是我没有考虑全面?

发表于 2025-01-20 23:20:07 回复(0)
select
    d.dept_no,
    d.dept_name,
    t.title,
    count(t.title) as count
from
    departments d
    inner join dept_emp e on d.dept_no = e.dept_no
    inner join titles t on e.emp_no = t.emp_no
group by
    d.dept_no,
    d.dept_name,
    t.title
order by
    d.dept_no,
    t.title;

发表于 2025-01-03 17:04:17 回复(0)
select dept_no,dept_name,title,count(*)
from dept_emp de
join titles t using(emp_no)
join departments using(dept_no)
where t.to_date = '9999-01-01' and de.to_date = '9999-01-01'
group by dept_no,dept_name,title
order by dept_no,title 
请问这样写有问题吗
发表于 2024-12-29 20:38:46 回复(0)
select
    d.dept_no,
    d.dept_name,
    t.title,
    count(t.title) count
from
    dept_emp de
    left join departments d on de.dept_no = d.dept_no
    left join titles t on de.emp_no = t.emp_no
group by
    de.dept_no,
    t.title
order by
    dept_no,
    title

发表于 2024-11-27 17:05:47 回复(0)
select
d.dept_no dept_no
,d.dept_name dept_name
,t.title title
,count(e.dept_no) count
from dept_emp e
left join departments d
on e.dept_no = d.dept_no
left join titles t
on e.emp_no = t.emp_no
group by 1,3
order by 1,3
发表于 2024-11-24 14:16:54 回复(0)
select d.dept_no,d.dept_name,title,count(title) as count from departments as d
inner join dept_emp as de on d.dept_no=de.dept_no and de.to_date='9999-01-01'
inner join titles as t on t.emp_no=de.emp_no and t.to_date='9999-01-01'
group by d.dept_no,d.dept_name,title
order by d.dept_no,title;
发表于 2024-10-26 17:24:34 回复(0)
select
d.dept_no,
m.dept_name,
t.title,
count(*) as count
from dept_emp d
join titles t
on d.emp_no = t.emp_no
left join departments m
on d.dept_no = m.dept_no
group by d.dept_no,m.dept_name,t.title
order by d.dept_no,t.title
发表于 2024-09-30 10:05:31 回复(0)