You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access SQL中能否用HAVING实现记录集的AND与OR组合筛选?

解决方法

你的核心需求是筛选指定客户的两类发票:

  1. 发票日期在180天以内的所有记录(无论是否付款)
  2. 发票日期超过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:15:42