如何用一条SQL统计出部门,单位,部门下的人数,统计出的人数包括没有人的部门

图片说明
图片说明

(图一是部门,图二是部门下的人员,判断一个人是不是在一个部门要用apartment和unit_name双主键来判断)
下方是两个表结构:

personUnit是部门表

CREATE TABLE `person_unit` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `apartment` varchar(255) DEFAULT NULL,
  `num` int(11) DEFAULT NULL,
  `unit_name` varchar(255) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `cup_num` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8;

下方是人员表(f_user)

CREATE TABLE `f_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `comment` varchar(255) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `face_id` varchar(255) DEFAULT NULL,
  `id_card` varchar(255) DEFAULT NULL,
  `is_deploy` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `photo` varchar(255) DEFAULT NULL,
  `photo_url` varchar(255) DEFAULT NULL,
  `unit_name` varchar(255) DEFAULT NULL COMMENT '所属单位',
  `update_date` datetime DEFAULT NULL,
  `work_num` varchar(255) DEFAULT NULL COMMENT '工号',
  `apartment` varchar(255) DEFAULT NULL COMMENT '所属部门',
  `position` varchar(255) DEFAULT NULL,
  `user_id` varchar(255) DEFAULT NULL,
  `phone_num` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `unit_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

用union分开统计


SELECT p.unit_name  as '单位',u.apartment as '部门', COUNT(u.id) as '部门人数'
FROM person_unit p, f_user u
WHERE p.id = u.unit_id GROUP BY u.apartment
UNION
SELECT p.unit_name,p.apartment, 0
FROM person_unit p
WHERE p.apartment not in (SELECT DISTINCT(u.apartment) from f_user u)


图片说明
图片说明
图片说明

SELECT p.unit_name as '单位',u.apartment as '部门', sum(case when u.id is null then 0 else 1 end) as '部门人数'
FROM person_unit p
left join f_user u on p.unit_name = u.unit_name and p.apartment = u.apartment
GROUP BY p.unit_name, u.apartment