我试图创建一个sql来生成一个出勤报告,以确定缺席,迟到,不完整的登录和继承。下面是我使用的虚拟表。
Employee
Employee ID Name
001 Paul
002 Juan
003 Elise
Schedule
ID EmployeeID Schedule
1 001 11:00PM - 8:00AM
2 002 11:00PM - 8:00AM
3 003 11:00PM - 8:00AM
Attendance
ID EmployeeID Type Datetime
1 001 0 2015-07-25 22:00:00
2 002 0 2015-07-25 22:48:00
3 003 0 2015-07-25 20:48:00
1 001 1 2015-07-25 08:00:00
2 002 1 2015-07-25 08:44:00
3 003 1 2015-07-25 08:00:00
我的sql
SELECT * FROM Employee
INNER JOIN Schedule ON Employee.EmployeeID = Schedule.EmployeeID
INNER JOIN Attendance ON Employee.EmployeeID = Attendance.EmployeeID
CASE WHEN Schedule.Schedule < Attendance.DateTime THEN 1 as Late;
这是我的sql,但我不确定它是否正确。从那以后它会加1。我使用type列来确定登录和注销,其中1是注销,0是登录。另外我们如何才能在定义日期,例如,2015-07-20到2015-07-25之间获得总计。有帮助吗?
答案 0 :(得分:0)
这里有点猜测因为没有什么可以解决的。我建议您不要习惯在不同的表中更改给定信息的列名。 EmployeeID应该始终是EmployeeID。
这样的事情会让你指向正确的方向。
select e.EmployeeID
, e.Name
, SUM(Case when s.Schedule < a.DateTime THEN 1 else 0 end) as TotalLate
, SUM(case when a.DateTime is null then 1 else 0 end) as TotalAbsent
from Employee e
join Schedule s on s.EmployeeID = e.ID
left join Attendance a on a.EmployeeID = e.ID and a.ID = s.ID