Microsoft Access 掲示板

クエリが複雑すぎます / 11

18 コメント
views
4 フォロー
11
hatena 2020/04/08 (水) 12:35:10 修正

ちょっと考えてみました。

まず、下記のようなテーブルを作成します。

テーブル名 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期首日月末
12019/07/012019/07/31
22019/07/012019/08/31
32019/07/012019/09/30
42019/07/012019/10/31
52019/07/012019/11/30
62019/07/012019/12/31
72019/07/012020/01/31
82019/07/012020/02/29
92019/07/012020/03/31
102019/07/012020/04/30
112019/07/012020/05/31
122019/07/012020/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月とデータのすべての組み合わせが出力される。
  • これを、[期首日]から[月末]で抽出する。
  • それを集計する。
通報 ...
  • 12

    上記で仕入関係のデータは得られます。移動平均もクエリ内で計算できると思います。
    同様に、売上関係のデータを出力するクエリを作成します。
    2つのクエリを[月ID]で結合すれば月別の移動平均データができると思います。

    月別データが縦に並びますが、もし、横に並べないなら、クロス集計クエリで横並びに変換できます。