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

如何修改Access查询以仅显示各地点最高AvgAmount记录

解决Access查询中每个地点仅显示最高平均金额记录的方案

针对你的需求,我们可以通过子查询+关联匹配的方式实现每个地点只保留平均金额最高的那条记录,修改后的SQL语句如下:

SELECT a.Location, a.ExpPurposeID, a.ExpPurposeDescr, a.AvgAmount
FROM (
    -- 第一步:计算所有符合条件的地点+费用类型的平均金额
    SELECT Trip.Location, ExpPurpose.ExpPurposeID, ExpPurpose.ExpPurposeDescr, AVG(TripEmployeeExpPurpose.Amount) AS AvgAmount
    FROM Trip
    INNER JOIN TripEmployeeExpPurpose ON TripEmployeeExpPurpose.TripID = Trip.TripID
    INNER JOIN ExpPurpose ON TripEmployeeExpPurpose.ExpPurposeID = ExpPurpose.ExpPurposeID
    GROUP BY Trip.Location, ExpPurpose.ExpPurposeID, ExpPurpose.ExpPurposeDescr
    HAVING AVG(TripEmployeeExpPurpose.Amount) > 558.436888
) AS a
-- 第二步:关联子查询,匹配每个地点的最高平均金额记录
INNER JOIN (
    SELECT Location, MAX(AvgAmount) AS MaxAvgAmount
    FROM (
        -- 复用第一步逻辑,提取地点和对应的平均金额
        SELECT Trip.Location, AVG(TripEmployeeExpPurpose.Amount) AS AvgAmount
        FROM Trip
        INNER JOIN TripEmployeeExpPurpose ON TripEmployeeExpPurpose.TripID = Trip.TripID
        INNER JOIN ExpPurpose ON TripEmployeeExpPurpose.ExpPurposeID = ExpPurpose.ExpPurposeID
        GROUP BY Trip.Location, ExpPurpose.ExpPurposeID, ExpPurpose.ExpPurposeDescr
        HAVING AVG(TripEmployeeExpPurpose.Amount) > 558.436888
    ) AS b
    GROUP BY Location
) AS m ON a.Location = m.Location AND a.AvgAmount = m.MaxAvgAmount;

逻辑说明:

  1. 内层子查询b:和你原查询逻辑一致,计算所有满足平均金额>558.436888的地点+费用类型组合的平均金额。
  2. 中间子查询m:基于子查询b的结果,按地点分组,找出每个地点对应的最高平均金额MaxAvgAmount。
  3. 外层查询:将第一步的完整结果(包含费用类型信息)和第二步的最高金额数据关联,筛选出每个地点中平均金额等于该地点最高值的记录,最终实现每个地点仅保留一条金额最高的记录。

补充说明:

  • 这里用INNER JOIN替代了你原查询中的逗号连接方式,逻辑更清晰,也符合现代SQL规范。
  • 如果某个地点存在多个费用类型的平均金额并列最高,这个语句会返回所有并列的记录;如果只需要返回其中一条,可以在最外层查询中添加TOP 1并结合ORDER BY AvgAmount DESC(需注意Access中TOP的用法,可能需要配合分组调整)。

内容的提问来源于stack exchange,提问作者Lim Hong En

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:22:47