这是我第一次在这个论坛上发帖提问。我一直在努力在Microsoft Access中编写查询一周,我希望有人可以帮助我。我正在使用vb6中的指纹构建考勤应用程序。
表格如下:
https://i.stack.imgur.com/MZcwI.png
正如您在表中所见,员工每天可以登记和退房超过2次。我的问题是:如何在OriginType列中确定哪一行是IN还是Out?当员工第一次办理登记时,OriginType应为"我"。当他第二次登记时,OriginType应为" O"。当他第三次登记时,OriginType应该是"我"再一次等等。
第二个问题与上一个问题不同。
我想编写一个从timeInOut列中选择的查询。我希望桌子看起来像这样:
https://i.stack.imgur.com/GgAhx.png
正如您所看到的,现在有2个新列,并且不再有OriginType列。我仍然想使用相关子查询和模数运算符。当它签入时,我希望它被放置在列中" CheckIn"如果结帐,我希望将其放在" CheckOut"列中。
答案 0 :(得分:0)
您可以从以下查询中获取最后一个OriginType,然后插入' I'如果最后是" O",或查询没有返回任何行," O"如果上次是"我"。
SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)
答案 1 :(得分:0)
您可以使用相关子查询和模数运算符:
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(例如,第1,第3,第5等登记),如果不是,则返回0。
如果计数可以被2整除,那么它必须是一个登记入住,如果不是,那就是结账。