2015-06-08 42 views
1

我有一個表,看起來像這樣: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月(6/2015)至2014年6月(6/2014)的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)); 

但同樣,我堅持了幾個月值爲每個。什麼是最佳行動方案?有沒有辦法將年份和月份字段合併到另一個查詢中,並使用該字段做些事情(只是拋出想法,我很迷茫)?

回答

1

也許這樣的事情會工作:

Select id, avg(Table.Attribute) 
From Table 
Where (Year*100 + Month) between 201406 and 201506 
Group by id, (Year*100 + Month) 
+0

我認爲應該根據問題分組ID,然後日期。 – MartianCodeHound

+0

當然,感謝您的更正。已編輯帖子。 – Olha

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