如何修改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;
逻辑说明:
- 内层子查询b:和你原查询逻辑一致,计算所有满足
平均金额>558.436888的地点+费用类型组合的平均金额。 - 中间子查询m:基于子查询b的结果,按地点分组,找出每个地点对应的最高平均金额
MaxAvgAmount。 - 外层查询:将第一步的完整结果(包含费用类型信息)和第二步的最高金额数据关联,筛选出每个地点中平均金额等于该地点最高值的记录,最终实现每个地点仅保留一条金额最高的记录。
补充说明:
- 这里用
INNER JOIN替代了你原查询中的逗号连接方式,逻辑更清晰,也符合现代SQL规范。 - 如果某个地点存在多个费用类型的平均金额并列最高,这个语句会返回所有并列的记录;如果只需要返回其中一条,可以在最外层查询中添加
TOP 1并结合ORDER BY AvgAmount DESC(需注意Access中TOP的用法,可能需要配合分组调整)。
内容的提问来源于stack exchange,提问作者Lim Hong En
相关产品推荐
相关产品推荐

