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

在MS Access中计算4行移动平均值的实现方法

当然可以在MS Access里实现这种4期移动平均!我帮你整理了两种实用的方法,你可以根据自己的情况选择:

方法一:使用子查询(推荐,更可靠)

这种方法通过关联自身表来计算每个周对应的前3周+当前周的平均值,逻辑清晰且性能稳定,尤其适合数据量中等的情况。

假设你的表名为SalesData(记得替换成你实际的表名),字段分别是Week(数字型)、DATES(日期型)、CURRYR(数值型),可以直接用下面的SQL查询:

SELECT 
    t1.Week,
    t1.DATES,
    t1.CURRYR,
    (SELECT Avg(t2.CURRYR) 
     FROM SalesData t2 
     WHERE t2.Week BETWEEN t1.Week - 3 AND t1.Week) AS MOVINGAVG
FROM SalesData t1
ORDER BY t1.Week;

说明:

  • 前3周(Week1-3)的MOVINGAVG会显示为NULL,因为没有足够的历史数据,完全符合你的示例要求;
  • 从Week4开始,每一行的MOVINGAVG就是当前周往前数3周(共4周)的CURRYR平均值;
  • 如果你的周数可能存在缺失(比如某周没有数据),推荐用日期范围来判断,这样更准确:
SELECT 
    t1.Week,
    t1.DATES,
    t1.CURRYR,
    (SELECT Avg(t2.CURRYR) 
     FROM SalesData t2 
     WHERE t2.DATES BETWEEN DateAdd("ww", -3, t1.DATES) AND t1.DATES) AS MOVINGAVG
FROM SalesData t1
ORDER BY t1.DATES;

这里DateAdd("ww", -3, t1.DATES)会自动计算当前日期往前推3个星期的日期,确保取到连续的4周数据。

方法二:使用域聚合函数DAvg(适合快速实现)

如果你不太熟悉子查询,也可以用Access自带的DAvg域函数来快速计算,写法更简洁:

SELECT 
    Week,
    DATES,
    CURRYR,
    DAvg("CURRYR", "SalesData", "Week BETWEEN " & [Week]-3 & " AND " & [Week]) AS MOVINGAVG
FROM SalesData
ORDER BY Week;

说明:

  • DAvg函数的三个参数分别是:要计算平均值的字段名、表名、筛选条件;
  • 同样,前3周会返回NULL,从Week4开始计算4期平均;
  • 如果用日期判断,把条件改成"DATES BETWEEN DateAdd('ww', -3, #" & [DATES] & "#) AND #" & [DATES] & "#"即可。
关键注意事项

如果你的CURRYR字段是带逗号的文本型(比如示例里的351,929.76),计算前必须先转换成数值型,否则会报错。比如把Avg(t2.CURRYR)改成Avg(CDbl(Replace(t2.CURRYR, ",", ""))),或者DAvg里的字段改成"CDbl(Replace(CURRYR, ',', ''))"。

你可以直接把这些SQL复制到Access的查询设计视图里(切换到SQL视图),执行后就能得到你想要的结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:59:37