我公司有以下表名为× ×员工× ×:
| 雇员人数|姓名|
| - -|- -|
| 第001章|乔治|
| 002年|玛丽|
并将该表称为记录:
| 雇员人数|日期|
| - -|- -|
| 第001章|2021年12月1日|
| 002年|2021年12月1日|
| 第001章|2021年12月2日|
| 002年|2021年12月1日|
| 第001章|2021年12月3日|
| 002年|2021年12月6日|
| 002年|2021年12月7日|
records表包含雇员的编号沿着他们的出勤日期;我想要得到的是雇员缺勤的天数(records表不包含这些日期)。
在上面的示例中,两名员工都在12月1日和2日参加了培训;玛丽在第03天缺勤,乔治在第06天和第07天缺勤。第04天和第05天是周末,因此不将其视为缺勤,因为这两天是非工作日(工作日是从星期一到星期五)。
我所寻找的是获得一个结果,其中显示了员工编号、他的姓名和他缺席的日期:
| 雇员人数|姓名|缺席的|
| - -|- -|- -|
| 第001章|乔治|六、七|
| 002年|玛丽|三个|
我有一个包含该月所有日期的表,名为dates:
| 识别码|日期|
| - -|- -|
| 一个|2021年12月1日|
| 2个|2021年12月2日|
| 三个|2021年12月3日|
| 四个|2021年12月4日|
| 五个|2021年12月5日|
| 六个|2021年12月6日|
| 七个|2021年12月7日|
我所做的唯一一件事就是开发了这个查询,它将一个月中的天数分配给每个用户,但是它需要与records表进行比较,以便只显示缺勤的天数:
SELECT u.num_employee, u.name, d.date FROM employees e
JOIN
(SELECT date FROM dates) d
LEFT JOIN
(SELECT num_employee, GROUP_CONCAT(DISTINCT EXTRACT( DAY FROM date)) AS date FROM records WHERE date BETWEEN '2021-12-01' AND '2021-12-07' GROUP BY num_employee) r
ON e.num_employee = r.num_employee
使用上面的查询,我得到以下结果:
| 雇员人数|姓名|日期|
| - -|- -|- -|
| 第001章|乔治|一、二、三、四、五、六、七|
| 002年|玛丽|一、二、三、四、五、六、七|
如何修改查询以停止要求按员工筛选,并显示所有员工及其缺勤日期?
我在phpMyAdmin中使用MariaDB。CTE不适用于我正在使用的版本。
在这个例子中,我只考虑了十二月的第一周。
1条答案
按热度按时间bmvo0sr51#