我有考勤表:
EmpId | 日期输入 | Att类型 |
---|---|---|
E-0001 | 2024-01-01 08:00:02 | 在 |
E-0001 | 2024-01-01 17:01:00 | 出 |
E-0002 | 2024-01-01 07:59:02 | 在 |
E-0002 | 2024-01-01 17:00:07 | 出 |
如何查询此表:
日期输入 | EmpID | 打卡上班 | 下班 |
---|---|---|---|
2024-01-01 | E-0001 | 08:00:02 | 17:01:00 |
2024-01-01 | E-0002 | 07:59:02 | 17:00:07 |
其中 ClockIn/ClockOut 基于 AttType(当“IN”时然后 ClockIn,当“OUT”时然后 ClockOut)
我尝试了这个查询:
SELECT EmpID,
DateEntry,
CASE
WHEN AttType = 'IN' THEN DateEntry
ELSE NULL
END AS ClockIn,
CASE
WHEN AttType = 'OUT' THEN DateEntry
ELSE NULL
END AS ClockOut
FROM Attendance
GROUP BY EmpID,
DateEntry;
但结果是:
日期输入 | EmpID | 打卡上班 | 下班 |
---|---|---|---|
2024-01-01 | E-0001 | 08:00:02 | |
2024-01-01 | E-0001 | 17:01:00 | |
2024-01-01 | E-0002 | 07:59:02 | |
2024-01-01 | E-0002 | 17:00:07 |
如何得到正确的结果?有人可以帮助我吗?谢谢你。
这可以通过使用聚合函数基于日期部分的条件聚合来完成
MAX()
:
SELECT EmpID,
DATE(DateEntry) AS DateEntry,
MAX(CASE
WHEN AttType = 'IN' THEN TIME(DateEntry)
ELSE NULL
END) AS ClockIn,
MAX(CASE
WHEN AttType = 'OUT' THEN TIME(DateEntry)
ELSE NULL
END) AS ClockOut
FROM Attendance
GROUP BY EmpID,
DATE(DateEntry);