因为您希望获得每个日期的每个员工的状态,所以需要执行
CROSS JOIN
在员工列表之间(从
Attendance
)以及日期列表(从
Calendar
)然后
LEFT JOIN
到
出勤
得到
ispresented
对于每个组合:
SELECT E.emp_id,
C.date,
COALESCE(A.ispresented, 0) AS ispresented
FROM (SELECT DISTINCT emp_id
FROM Attendance) E
CROSS JOIN Calendar C
LEFT JOIN Attendance A ON A.emp_id = E.emp_id AND A.attended_date = C.date
ORDER BY emp_id, date
输出:
emp_id date ispresented
EMP001 2019-08-01 1
EMP001 2019-08-02 1
EMP001 2019-08-03 1
EMP001 2019-08-04 1
EMP001 2019-08-05 0
EMP002 2019-08-01 0
EMP002 2019-08-02 1
EMP002 2019-08-03 1
EMP002 2019-08-04 1
EMP002 2019-08-05 1
EMP003 2019-08-01 1
EMP003 2019-08-02 1
EMP003 2019-08-03 1
EMP003 2019-08-04 0
EMP003 2019-08-05 0
EMP004 2019-08-01 0
EMP004 2019-08-02 0
EMP004 2019-08-03 1
EMP004 2019-08-04 1
EMP004 2019-08-05 1
EMP005 2019-08-01 1
EMP005 2019-08-02 0
EMP005 2019-08-03 0
EMP005 2019-08-04 0
EMP005 2019-08-05 1
Demo on dbfiddle