MS Access VBA SQL查询使用多个AND运算符失败?

MS Access VBA SQL查询使用多个AND运算符失败?,sql,vba,ms-access,Sql,Vba,Ms Access,我有一个表格tbl_Avail,显示了不同的人在特定日期和特定日期的特定部分的可用性。我试图做一个查询,统计在多个日期和特定时间的可用人数 tbl_Avail:Pas1和Pas2布尔值表示我搜索可用性的一天中的两个时段。True表示可用-false,不可用 ID Student Date_Avail Pas1 Pas2 1 Joe 2020/08/09 x 2 Bob 2020/08/09 x 3 Pete

我有一个表格tbl_Avail,显示了不同的人在特定日期和特定日期的特定部分的可用性。我试图做一个查询,统计在多个日期和特定时间的可用人数

tbl_Avail:Pas1和Pas2布尔值表示我搜索可用性的一天中的两个时段。True表示可用-false,不可用

ID   Student   Date_Avail    Pas1    Pas2
1    Joe       2020/08/09    x
2    Bob       2020/08/09            x
3    Pete      2020/08/09    x
4    Joe       2020/08/08    x       x
5    Bob       2020/08/08    x
6    Pete      2020/08/08    x       x
在本例中,我正在搜索日期2020/08/08 Pas2和日期2020/08/09 Pas1上的可用人数true,但当我运行查询时,它返回0-我的预期结果将是2,因为Joe和Pete在8日的Pas2和9日的Pas1中都可用

我的问题是:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim StudentsAvail As Long

Set rs = db.OpenRecordset("SELECT Count(*) AS StudentsTotal FROM tbl_Avail WHERE ((Pas1=true AND Date_Avail= #2020/08/09#) and (Date_Avail=#2020/08/08# AND Pas2=true))")
StudentsAvail = rs!StudentsTotal
如果我将查询更改为仅使用…。例如,当Pas1=true且Date_Avail=2020/08/09时,它工作正常。没有错误代码-它只计算0

如果您知道我做错了什么,或者有更好的解决方案,请告诉我:- 非常感谢。
Peter

一种方法是两级聚合:

SELECT Count(*) AS StudentsTotal
FROM (SELECT Student
      FROM tbl_Avail
      GROUP BY Student
      HAVING SUM(IIF(Pas1 = true AND Date_Avail = #2020/08/09#, 1, 0)) > 0 AND
             SUM(IIF(Pas2 = true AND Date_Avail = #2020/08/08#, 1, 0)) > 0
     ) as s;
子查询返回两个条件均为true的学生。If使用HAVING子句,因为条件在不同的行上为true


外部查询对学生进行计数。

效果很好:-1,0在日期之后做什么?@Sapster77。这些是IIF的参数-当条件为真或为非真时。@Sapster77,它们是IIF表达式的结果。如果条件为true,则返回1表示true;如果条件为false,则返回0表示false。所有结果相加,然后求和,如果大于零,则进行比较。只有当两个结果都为真时,结果True或False才与运算符True合并。。现在,您可以在子查询中使用它作为条件,该子查询只返回与该条件匹配的行,并且您可以聚合该结果的计数。是否可以在一个单独的表tbl_Ready中将布尔列Ready更新为true,并将来自子查询的结果(Student列出现在两个表中)?例如,子查询返回的学生姓名应在tbl_Ready中的列Ready中设置为true。我尝试了更新tbl\U ready SET Student=true,其中Student=SELECT Student FROM tbl\U Avail…等等,但get runtime 3354此子查询最多可返回1条记录。@Sapster77。这听起来是可能的-虽然有点复杂,超出了这个问题的范围。你的查询条件永远不会满足,因为没有日期可以是2020/08/08和2020/08/09。您希望将Pas1=true和Date_Avail=2020/08/09、Date_Avail=2020/08/08和Pas2=true这两个条件与OR运算符连接起来。