Microsoft Access 中的出勤查询
Attendances query in Microsoft Access
这是我第一次在这个论坛上发帖提问。一周以来,我一直在努力在 Microsoft Access 中编写查询,我希望这里有人可以帮助我。我正在使用 vb6 中的指纹构建一个考勤应用程序。
table 看起来像这样:
https://i.stack.imgur.com/MZcwI.png
如您在 table 中所见,一名员工每天可以签入和签出 2 次以上。我的问题是:如何在 OriginType 列中确定哪一行是 IN 或 Out?当员工第一次签到时,OriginType 应该是 "I"。当他第二次签入时,OriginType 应该是 "O"。当他第 3 次签入时,OriginType 应该再次为 "I",依此类推。
第二题与上一题不同。
我想编写一个从 timeInOut 列中进行选择的查询。我希望 table 看起来像这样:
https://i.stack.imgur.com/GgAhx.png
如您所见,现在有 2 个新列,并且不再有 OriginType 列。我仍然想使用相关子查询和取模运算符。当它是签入时,我希望它被放置在列 "CheckIn" 中,如果它是结帐,我希望它被放置在列 "CheckOut" 中。
您可以从以下查询中获取最后一个 OriginType,然后插入 'I' 如果最后一个是 "O",或者查询没有返回任何行并且 "O" 如果最后一个是 "I"。
SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)
您可以为此使用相关子查询和取模运算符:
SELECT EmployeeID,
timeInOut,
IIF(
(SELECT COUNT(*)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeID
AND s.timeInOut <= m.timeInOut
AND s.timeInOut >= INT(m.timeInOut)) Mod 2 = 1, "I", "O") As OriginType
FROM MyTable m
此查询按以下方式工作:
子查询获取与当前行在同一日期发布的该员工的行数。然后,我们计算该计数的 2 的模数,如果计数不能被 2 整除(例如第 1、3、5 等 check-in)则返回 1,否则返回 0。
如果计数能被2整除,那么一定是签入,否则就是签出。
这是我第一次在这个论坛上发帖提问。一周以来,我一直在努力在 Microsoft Access 中编写查询,我希望这里有人可以帮助我。我正在使用 vb6 中的指纹构建一个考勤应用程序。
table 看起来像这样:
https://i.stack.imgur.com/MZcwI.png
如您在 table 中所见,一名员工每天可以签入和签出 2 次以上。我的问题是:如何在 OriginType 列中确定哪一行是 IN 或 Out?当员工第一次签到时,OriginType 应该是 "I"。当他第二次签入时,OriginType 应该是 "O"。当他第 3 次签入时,OriginType 应该再次为 "I",依此类推。
第二题与上一题不同。
我想编写一个从 timeInOut 列中进行选择的查询。我希望 table 看起来像这样:
https://i.stack.imgur.com/GgAhx.png
如您所见,现在有 2 个新列,并且不再有 OriginType 列。我仍然想使用相关子查询和取模运算符。当它是签入时,我希望它被放置在列 "CheckIn" 中,如果它是结帐,我希望它被放置在列 "CheckOut" 中。
您可以从以下查询中获取最后一个 OriginType,然后插入 'I' 如果最后一个是 "O",或者查询没有返回任何行并且 "O" 如果最后一个是 "I"。
SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)
您可以为此使用相关子查询和取模运算符:
SELECT EmployeeID,
timeInOut,
IIF(
(SELECT COUNT(*)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeID
AND s.timeInOut <= m.timeInOut
AND s.timeInOut >= INT(m.timeInOut)) Mod 2 = 1, "I", "O") As OriginType
FROM MyTable m
此查询按以下方式工作:
子查询获取与当前行在同一日期发布的该员工的行数。然后,我们计算该计数的 2 的模数,如果计数不能被 2 整除(例如第 1、3、5 等 check-in)则返回 1,否则返回 0。
如果计数能被2整除,那么一定是签入,否则就是签出。