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

MS Access SQL:关联主表返回指定日期前的最新行

解决MS Access中获取指定日期前客户最后采购记录的问题

要实现你需要的结果,可以通过子查询获取每个客户的最新有效订单日期,再关联采购表和客户表得到对应记录。以下是具体的SQL语句:

SELECT 
    c.CustomerId AS fkCustomerId,
    c.Name,
    p.fkStockId
FROM 
    Customer c
INNER JOIN 
    Purchase p ON c.CustomerId = p.fkCustomerId
INNER JOIN (
    -- 子查询:获取每个客户在指定日期前的最大订单日期
    SELECT 
        fkCustomerId,
        MAX(OrderDate) AS LastOrderDate
    FROM 
        Purchase
    WHERE 
        OrderDate <= #2012-10-01#  -- 这里替换为你的指定日期,Access日期用#包裹
    GROUP BY 
        fkCustomerId
) AS sub ON p.fkCustomerId = sub.fkCustomerId AND p.OrderDate = sub.LastOrderDate
ORDER BY 
    c.CustomerId;

说明:

  1. 子查询部分先筛选出所有早于等于指定日期的采购记录,按客户分组后取每个客户的最新订单日期。
  2. 外层查询通过客户ID和订单日期,将客户表、采购表与子查询结果关联,从而定位到每个客户对应的最后一条采购记录的fkStockId。
  3. 如果需要包含从未采购过的客户(显示fkStockId为空白),可以把第一个INNER JOIN改成LEFT JOIN,同时处理p.fkStockId为NULL的情况:
SELECT 
    c.CustomerId AS fkCustomerId,
    c.Name,
    Nz(p.fkStockId, '无采购记录') AS fkStockId
FROM 
    Customer c
LEFT JOIN 
    Purchase p ON c.CustomerId = p.fkCustomerId
LEFT JOIN (
    SELECT 
        fkCustomerId,
        MAX(OrderDate) AS LastOrderDate
    FROM 
        Purchase
    WHERE 
        OrderDate <= #2012-10-01#
    GROUP BY 
        fkCustomerId
) AS sub ON p.fkCustomerId = sub.fkCustomerId AND p.OrderDate = sub.LastOrderDate
WHERE 
    sub.LastOrderDate IS NOT NULL OR p.fkCustomerId IS NULL
ORDER BY 
    c.CustomerId;

注意事项:

  • Access中日期常量必须用#包裹,格式建议用YYYY-MM-DD避免地区格式冲突。
  • 如果同一客户在同一日期有多条采购记录,这个查询会返回所有该日期的记录,若要只取其中一条,可以在子查询或外层添加额外的排序/筛选条件(比如按fkStockId取最大或最小)。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:45:37