这是我第一次在这个论坛上发布问题。一个星期以来,我一直在努力在 Microsoft Access 中编写查询,我希望这里有人可以帮助我。我正在使用 vb6 中的指纹构建考勤应用程序。
该表如下所示:
https://i.stack.imgur.com/MZcwI.png
正如您在表格中看到的,员工每天可以签入和签出 2 次以上。我的问题是:如何在 OriginType 列中确定哪一行是 IN 还是 Out?当员工首次签到时,OriginType 应为"I"。当他第二次签入时,OriginType应该是"O"。当他第三次签到时,OriginType 应该再次是"I",依此类推。
第二个问题与最后一个问题不同。
我想编写一个从 timeInOut 列中进行选择的查询。我希望表格看起来像这样:
https://i.stack.imgur.com/GgAhx.png
如您所见,现在有 2 个新列,不再有 OriginType 列。我仍然想使用相关的子查询和模运算符。当它是签入时,我希望它放在"签入"列中,如果是结帐,我希望它放在"签出"列中。
为此,可以使用相关的子查询和模运算符:
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 等签到),则返回 1,如果不是,则返回 0。
如果计数可被 2 整除,则它必须是签入,如果不是,则为签出。
您可以从以下查询中获取最后一个 OriginType,如果最后一个是"O",则插入"I",或者查询没有返回任何行,如果最后一个是"I",则插入"O"。
SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)