基于日期的平均访问查询

时间:2015-06-08 14:59:38

标签: sql date ms-access

我有一个看起来像这样的表:

╔═════╦═══════════╦══════╦═══════╗
║ 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字段组合成另一个查询并用它做一些事情(只是抛出想法,我很丢失)?

2 个答案:

答案 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