MS Access - 登记/退房系统

时间:2018-06-11 08:52:48

标签: ms-access

我在MS Access中编写一个从两个表中提取信息的问题。 简要说明: 员工启动作业并单击Excel宏中的按钮。宏保存员工提供的日期和注释(不是必需的)。接下来,宏将信息推送到Access数据库中的一个表中,该数据库收集所有员工的所有“签到”。一个人有可能偶然两次办理登机手续。这是一个示例,在一个有三名员工的公司中,该表在两个工作日后的样子如何: check-in table example

同样,宏允许用户签出,也可以选择注释: check-out table example

我需要的是一个查询,它将合并其中两个表并显示前一天员工的签入/签出,以及提供的评论。所以查询的结果如下所示: outcome of a table for previous day 列顺序在这里绝对无关

SELECT min(checkin.[check-in time]), max(checkout.[check-out time]), checkin.[comment] AS [check-in comment], checkout.[comment] AS [check-out comment] 
FROM checkin 
RIGHT JOIN chekout ON checkin.analyst = checkout.analyst
    WHERE checkin[check-in time] = Date()-3;

不好的是,MS Access抛出:

  

JOIN操作中的语法错误

有人可以帮助我,并建议我该怎么办?不幸的是,我无法控制系统是如何实现的(Excel中的宏与Access连接),遗憾的是我没有太多的MS Access经验。

编辑: 非常感谢@Erik,非常感谢。它帮助了很多,下次在拼写错误时我会更加勤奋。然而,新问题出现了。一个人可以在没有退房的情况下办理登机手续,反之亦然。让我们说第一个表中还有另一行 - > Meg015于08.06.2018在7:20签到,但忘了退房:

see an example

我希望MS Access能够相应地显示此信息(不会忘记签出时间): How it should look like

由于MS Access中没有Full Outer Join,我正在考虑关注UNION / LEFT和RIGHT JOIN:

SELECT checkin.analyst, min(checkin.[check-in time]), max(checkout.[check-out time]), checkin.comment, checkout.comment
FROM checkin RIGHT JOIN checkout ON (checkin.analyst = checkout.analyst OR checkout.analyst = NULL OR checkin.analyst = NULL)
WHERE (format(checkin.[check-in time], "Short Date") = format(checkout.[check-out time], "Short Date") OR checkout.[check-out time] = NULL) AND format(checkin.[check-in time], "Short Date") = date()-3
GROUP BY checkin.analyst, checkin.comment, checkout.comment

UNION 

SELECT checkout.analyst, min(checkin.[check-in time]), max(checkout.[check-out time]), checkin.comment, checkout.comment
FROM checkin LEFT JOIN checkout ON (checkin.analyst = checkout.analyst OR checkin.analyst = NULL OR checkout.analyst = NULL)
WHERE (format(checkin.[check-in time], "Short Date") = format(checkout.[check-out time], "Short Date") OR checkin.[check-in time] = NULL) AND format(checkin.[check-in time], "Short Date") = date()-3
GROUP BY checkout.analyst, checkin.comment, checkout.comment;

可悲的是,梅格的登记入住详情在上述查询结果中不可见。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您错过了一个点,在您的联接中进行拼写错误检查,并且正在使用聚合而不按其他列进行分组。

此外,您正在测试日期是否等于某个时间日期,这几乎总是错误的。

无论如何,这就是你的查询的样子:

SELECT checkout.analyst, min(checkin.[check-in time]), max(checkout.[check-out time]), checkin.[comment] AS [check-in comment], checkout.[comment] AS [check-out comment] 
FROM checkin 
RIGHT JOIN checkout ON checkin.analyst = checkout.analyst
WHERE DATEDIFF('d',checkin.[check-in time],  Date()) = 3
GROUP BY checkout.analyst, checkout.[comment], checkin.[comment]

(请注意,有这么多错误的问题可能会因为过于宽泛而被关闭。)