我希望表 A 的所有行都应与表 B 连接。
表 A - 日历
id date
1 2019-08-01
2 2019-08-02
3 2019-08-03
4 2019-08-04
5 2019-08-05
表 B - 员工出勤
emp_id attended_date ispresented
EMP001 2019-08-01 1
EMP001 2019-08-02 1
EMP001 2019-08-03 1
EMP001 2019-08-04 1
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
EMP004 2019-08-03 1
EMP004 2019-08-04 1
EMP004 2019-08-05 1
EMP005 2019-08-01 1
EMP005 2019-08-05 1
这是示例表。在表 1 中,我生成了日期范围
在表 2 中 - 员工如果出勤将有出勤记录。
所以,即使员工没有被打开,我也想约会。
我试过左加入和所有。
join happens based on date if exists on both end.
我想添加不存在的日期,默认情况下保留字段将为空。
预期行应该是:
EMPID 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
等等...
因为你想获得每个员工每个日期的状态,你需要做的一个CROSS JOIN
员工(从选择列表之间Attendance
)和时间(从列表中Calendar
),然后LEFT JOIN
,为了Attendance
得到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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句