目录
题目
一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为'N'。
查出员工所属的直属部门。
准备数据
## 创建库
create database db;
use db;
## 创建表
Create table If Not Exists Employee (employee_id int, department_id int, primary_flag ENUM('Y','N'));
## 向表中插入数据
Truncate table Employee;
insert into Employee (employee_id, department_id, primary_flag) values ('1', '1', 'N');
insert into Employee (employee_id, department_id, primary_flag) values ('2', '1', 'Y');
insert into Employee (employee_id, department_id, primary_flag) values ('2', '2', 'N');
insert into Employee (employee_id, department_id, primary_flag) values ('3', '3', 'N');
insert into Employee (employee_id, department_id, primary_flag) values ('4', '2', 'N');
insert into Employee (employee_id, department_id, primary_flag) values ('4', '3', 'Y');
insert into Employee (employee_id, department_id, primary_flag) values ('4', '4', 'N');
employee表
分析数据
分析两种结果:
(1)只属于一个部门,不管表记录是什么,都是直属部门。使用count(*)=1
(2)当属于多个部门,选择登记表为“Y”的。
第一步:先用开窗函数根据员工id统计有几个部门
## 第一步:先用开窗函数根据员工id统计有几个部门
select employee_id,
department_id,
primary_flag,
count(*) over(partition by employee_id) as cn
from employee;
第二步:将两种情况都算进去,只要满足一个就行
## 第二步:将两种情况都算进去,只要满足一个就行
select employee_id,department_id from (
select employee_id,
department_id,
primary_flag,
count(*) over(partition by employee_id) as cn
from employee
) t
where t.cn = 1 or primary_flag = 'y';