在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
相关产品推荐
相关产品推荐

