1

这是我第一次在这个论坛上发帖提问。一个星期以来,我一直在努力在 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 列。我仍然想使用相关子查询和模运算符。当它是签入时,我希望将其放置在“签入”列中,如果是结账,我希望将其放置在“签出”列中。

4

2 回答 2

1

您可以从以下查询中获取最后一个 OriginType,如果最后一个是“O”,则插入“I”,或者如果最后一个是“I”,则查询不返回任何行和“O”。

SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)
于 2018-03-10T17:02:33.290 回答
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 次等签入),则返回 1,否则返回 0。

如果计数能被 2 整除,那么它一定是签入,如果不是,那就是签出。

于 2018-03-10T17:03:08.600 回答