ちょっと考えてみました。
まず、下記のようなテーブルを作成します。
テーブル名 T月
フィールド 名 | データ型 |
---|---|
月ID | 数値型(主キー) |
期首日 | 日付/時刻型 |
月末 | 日付/時刻型 |
月ID に 1 から 12 までの数値を入力します。
下記の更新クエリを実行します。
UPDATE t月, t決算日
SET
t月.期首日 = DateSerial(Year([決算日]),Month([決算日])-11,0)+1,
t月.月末 = DateSerial(Year([決算日]),Month([決算日])-11+[月ID],0);
これでt月は下記のようになります。
月ID | 期首日 | 月末 |
---|---|---|
1 | 2019/07/01 | 2019/07/31 |
2 | 2019/07/01 | 2019/08/31 |
3 | 2019/07/01 | 2019/09/30 |
4 | 2019/07/01 | 2019/10/31 |
5 | 2019/07/01 | 2019/11/30 |
6 | 2019/07/01 | 2019/12/31 |
7 | 2019/07/01 | 2020/01/31 |
8 | 2019/07/01 | 2020/02/29 |
9 | 2019/07/01 | 2020/03/31 |
10 | 2019/07/01 | 2020/04/30 |
11 | 2019/07/01 | 2020/05/31 |
12 | 2019/07/01 | 2020/06/30 |
下記のようなクエリを作成します。
SELECT
t商品マスタ.商品ID, t商品マスタ.商品名, t商品マスタ.期首数量, t商品マスタ.期首金額,
t月.月ID
Sum(t仕入明細.仕入数量) AS 仕入数量計,
Sum([仕入数量]*[仕入単価]) AS 仕入金額計
FROM t月, t商品マスタ INNER JOIN t仕入明細 ON t商品マスタ.商品ID = t仕入明細.仕入商品ID
WHERE t仕入明細.仕入日 Between [期首日] And [月末]
GROUP BY
t商品マスタ.商品ID, t商品マスタ.商品名, t商品マスタ.期首数量, t商品マスタ.期首金額,
t月.月ID
ORDER BY
t月.月ID;
これで移動平均を計算できるデータは揃うと思いますがいかがでしょうか。
実際のデータでの確認はしてませんので、見落としがあるかもしれません。
考え方を参考にしてください。下記のような考え方です。
- 日付計算が複雑なので、必要な日付を先に計算してテーブルに格納しておく。→T月
- T月 と 他のテーブルは結合しない → T月とデータのすべての組み合わせが出力される。
- これを、[期首日]から[月末]で抽出する。
- それを集計する。
通報 ...
上記で仕入関係のデータは得られます。移動平均もクエリ内で計算できると思います。
同様に、売上関係のデータを出力するクエリを作成します。
2つのクエリを[月ID]で結合すれば月別の移動平均データができると思います。
月別データが縦に並びますが、もし、横に並べないなら、クロス集計クエリで横並びに変換できます。