我有一个看起来像这样的表:
╔═════╦═══════════╦══════╦═══════╗
║ ID ║ Attribute ║ Year ║ Month ║
╠═════╬═══════════╬══════╬═══════╣
║ 1 ║ 15.2 ║ 2014 ║ 11 ║
║ 1 ║ 13.1 ║ 2014 ║ 12 ║
║ 1 ║ 5.6 ║ 2015 ║ 1 ║
║ 2 ║ 7.9 ║ 2014 ║ 11 ║
║ 2 ║ 12.3 ║ 2014 ║ 12 ║
║ 2 ║ 45.6 ║ 2015 ║ 1 ║
║ 3 ║ 23.2 ║ 2014 ║ 11 ║
║ 3 ║ 45.7 ║ 2014 ║ 12 ║
║ ... ║ ... ║ ... ║ ... ║
╚═════╩═══════════╩══════╩═══════╝
我想要做的是对去年的每个ID的“属性”进行平均,从当前月份和年份开始。例如,我可能希望查找从2015年6月(2015年6月)到2014年6月(2014年6月)的ID = 2
平均值。我试图只使用查询(没有VBA)来实现这一点。
我已经能够平均当前年份的“属性”,但这只包括今年过去的月份,而不是之前的月份,我遇到的真正问题是年份和月份分为两个字段。如果他们是约会对象,那将是微不足道的。
我还能够获得当前和前几年的数据:
SELECT Table.ID, Table.Year, Table.Month, Table.Attribute
FROM Table
WHERE
(((Table.ID)="Some ID Number")
AND ((Table.Year)=Year(Date())
Or (Table.Year)=Year(Date())-1));
但是,我仍然坚持每个人的月份和价值观。什么是最好的行动方案?有没有办法将Year和Month字段组合成另一个查询并用它做一些事情(只是抛出想法,我很丢失)?
答案 0 :(得分:1)
也许这样的事情会起作用:
Select id, avg(Table.Attribute)
From Table
Where (Year*100 + Month) between 201406 and 201506
Group by id, (Year*100 + Month)
答案 1 :(得分:0)
另一种方法是在派生表中使用DateSerial
重新创建强类型日期,然后您可以使用它来执行Group By Id
并应用平均聚合:
SELECT x.ID, Avg(x.Attribute) AS AvgOfAttribute
FROM (
SELECT MyTable.ID, MyTable.Attribute, DateSerial([Year], [Month],1) AS TheDate
FROM MyTable
) AS x
WHERE (((x.TheDate) >= '2014-06-01' And (x.TheDate) < '2015-06-01'))
GROUP BY x.ID;
显然,如果您使用单个ID进行过滤,则无需应用GROUP BY
。