MS Access SQL中能否用HAVING实现记录集的AND与OR组合筛选?
解决方法
你的核心需求是筛选指定客户的两类发票:
- 发票日期在180天以内的所有记录(无论是否付款)
- 发票日期超过180天且未付款的记录
之前的代码问题出在逻辑运算符的优先级和组合上:
- 第一段用
AND连接所有条件,只会保留「180天内+未付款」的记录,漏掉了180天内已付款的记录 - 第二段的
OR优先级低于AND,会错误包含「非当前客户的未付款发票」
正确的HAVING子句语法
HAVING ( Customers.[CustomerID] = [Forms]![OrdersByCustomer]![CustomerID] AND ( DateAdd("d", -180, Now()) <= Orders.[Invoice Date] OR ( DateAdd("d", -180, Now()) > Orders.[Invoice Date] AND Orders.[OrderPaid] = NO ) ) )
逻辑说明
- 外层先锁定当前客户,确保只处理目标客户的记录
- 内层用括号明确分组两个筛选规则:
- 要么发票日期在180天以内(不管付款状态)
- 要么发票日期超过180天,且未付款
额外优化建议
如果你的查询没有使用GROUP BY进行聚合计算,建议把条件放到WHERE子句中(执行效率更高):
WHERE ( Customers.[CustomerID] = [Forms]![OrdersByCustomer]![CustomerID] AND ( DateAdd("d", -180, Date()) <= Orders.[Invoice Date] OR ( DateAdd("d", -180, Date()) > Orders.[Invoice Date] AND Orders.[OrderPaid] = NO ) ) )
这里用Date()替代Now(),避免时间部分干扰日期判断(比如发票日期是2023-10-01,Now()会包含具体时间,而Date()仅保留日期部分,计算更精准)
内容的提问来源于stack exchange,提问作者Ashton
相关产品推荐
相关产品推荐

