我正在使用此查询来获取存在和不存在的员工的月度记录。 但是,我通过使用此查询获得了一名员工的结果,但是对于所有员工,它似乎都不起作用。
SELECT
m.emp_id AS `Empid`,
d.dt AS `AbsentDate`,
(CASE
WHEN p.punch_status IS NULL THEN 'A'
ELSE p.punch_status
END) s
FROM
(SELECT
DATE(t.added_date) AS dt
FROM
pmc_attendance t
WHERE
DATE(t.added_date) >= '2018-08-01'
AND DATE(t.added_date) < DATE_ADD('2018-08-31', INTERVAL 1 DAY)
GROUP BY DATE(t.added_date)
ORDER BY DATE(t.added_date)) d
CROSS JOIN
tbl_admin_users m
LEFT JOIN
pmc_attendance p ON DATE(p.added_date) >= d.dt
AND DATE(p.added_date) < d.dt + INTERVAL 1 DAY
AND p.emp_id = m.emp_id
WHERE
p.emp_id IS NULL AND m.emp_id = '000838'
GROUP BY d.dt
ORDER BY m.emp_id , d.dt
我正在使用两个表1. tbl_admin_users-存储的员工数据2. pmc_attendance-当前的员工记录。 在查询中是否已通过和m.emp_id ='000838',它可以正常工作,但我想显示所有员工的所有记录。有关如何优化此查询的任何建议。
答案 0 :(得分:0)
有两种方法可以构造此查询。我可以看到yuo在做什么,而且我认为唯一的问题是您的group by子句。您不需要它们,因为所有内容都应与众不同。您的状态将始终为“ A”,因为您只会得到当天没有员工打孔的行,因此您也可以取出案例说明。
SELECT
m.emp_id AS Empid,
d.dt AS AbsentDate,
'A' s
FROM
(
SELECT distinct DATE(t.added_date) AS dt
FROM pmc_attendance t
WHERE t.added_date >= '2018-08-01' AND DATE(t.added_date) < DATE_ADD('2018-08-31', INTERVAL 1 DAY)
) d
CROSS JOIN tbl_admin_users m
LEFT JOIN pmc_attendance p ON p.emp_id = m.emp_id and DATE(p.added_date) >= d.dt AND DATE(p.added_date) < d.dt + INTERVAL 1 DAY
WHERE p.emp_id IS NULL
ORDER BY m.emp_id , d.dt
如果您要同时包含当前和不存在的内容,则需要重新放入case语句,并删除支票WHERE p.emp_id IS NULL
如果您每天有多个打卡,则需要将其解析为一个带有MIN / MAX的单个条目,这样您每人每天只能获得一行,然后重新添加到您的group by Emp_ID, d.dt
< / p>