![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
会社コード、品目コード、月度、出荷数の入った明細テーブルがあります
これを過去3ヶ月で出荷数を移動平均したいのです
例 元データ
会社コード、品目コード、月度、出荷数
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201408,10
B00000002,BBBBBBB,201408,10
出力したい値
会社コード、品目コード、月度、出荷数
A00000001,AAAAAAA,201410,10←出荷数は同じ会社コード、品目コードの(10月+9月+8月)÷3)
A00000001,AAAAAAA,201409,3.33←出荷数は同じ会社コード、品目コードの(9月+8月+7月)÷3)
A00000001,AAAAAAA,201408,3.33←出荷数は同じ会社コード、品目コードの(8月+7月+6月)÷3)
B00000002,BBBBBBB,201408,3.33←出荷数は同じ会社コード、品目コードの(8月+7月+6月)÷3)
このような事がしたいのですがどのようにしたら実現できるでしょうか
月度で移動平均なんて良く使いそうな気がしますが・・簡単なようで難しく悩んでおります
どうかよろしくお願い致します
No.7
- 回答日時:
【お詫びと補足】
補足質問の意味をやっと理解できました。つまり。添付図のような出力で対象月を全て出力したいということですね。私なら、VBAで期間を設定して出荷数=0の月があればInsert文を実行します。
理由:SQL文を考えるのが面倒臭いから!
[会社コード+品目コード+月次]で対象月に発生しているの全てに追加しないと目的は達成できないでしょう。ということは、添付図のクエリの結果を配列に取り込んで欠落月を挿入するというやり方が一番最初に思い付きます。ですから、それをVBAにて記述します。
![「accessで移動平均する方法」の回答画像7](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/f/1232063_5497ecd3d68c3/M.jpg)
No.4
- 回答日時:
移動平均にもいろいろありますが、
移動平均 - Wikipedia
http://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95% …
今回の事例は、上記の「単純移動平均」と私は解釈しました。
質問のデータ例が間違っているようですが、
やりたいことは下記のようなことですよね。
元データ
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201409,10
A00000001,AAAAAAA,201408,10
B00000002,BBBBBBB,201408,10
出力
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201409,6.66
A00000001,AAAAAAA,201408,3.33
B00000002,BBBBBBB,201408,3.33
月度 201409 の移動平均は、(9月+8月+7月)÷3 ですが、7月がないので20÷3=6.66・・・
になりますね。
ちなみに私の最初の回答の式にタイプミスがありました。
「Brtween」を「Between」に修正してください。
SQLも出しておきますね。
SELECT 会社コード, 品目コード, 月度,
DSum("出荷数","元データ","会社コード='" & [会社コード] & "' AND 品目コード='" & [品目コード] & "' AND 月度 Between " & Format(DateAdd("m",-3,Format([月度],"0000\/00")),"yyyymm") & " AND " & [月度])/3 AS 平均出荷数
FROM 元データ;
なお、丸め(四捨五入、切り捨て等)については、特に指定がないので考慮してません。
指定があるなら追記してください。
ありがとうございます
説明不足だった事に気がつきました
確かに教えて頂いた方法で計算できたのですが
問題は出荷が0件の時の扱いを説明していませんでした
最初の私の例では201409のデータは書いていませんが
これは出荷が0だったので明細データとして存在しないという意味です
そしてデータを収集を開始したのが8月から10月までなので
7月以前の移動平均の結果は出力する必要はないのですが
出荷数0の月の移動平均の出力結果も出したいのです
元データに8月~10月で存在しない月のデータがあったら出荷数0でデータを追加した後に
クエリを動かせば目的のものができるのですが
データ量が多いのでこの出荷数0を補完するデータをどのように作り出せばいいか今悩んでいます
追加したいデータは
A00000001,AAAAAAA,201409,0
B00000002,BBBBBBB,201410,0
B00000002,BBBBBBB,201409,0
になります
これを一気に追加することが追加クエリでできるでしょうか?
No.3
- 回答日時:
どうやら、私の解釈は合っているようなのでSQL文全体を補足します。
SELECT
DISTINCT [会社コード], [品目コード],
Rounds(Nz(DSum(・・・・・))/3,1) AS 平均出荷数
FROM 出荷履歴
WHERE 月度 BETWEEN "201408" AND "201410";
※DSum()関数内の書き方は、既に回答が付いているので割愛します。
直近3ヶ月ということですが、11月初旬ですと8月~10月ということも考えられます。そこら辺りをどのように考えておられるのかが不明。よって、一応、回答では開始月と終了月とを埋め込んでいます。実際に運用される場合は、しかるべく修正されて下さい。
注意点1、DSum()は Null 値を戻すこともあります。
Nz(DSum()) と Null を 0に変換しておいたが無難です。
注意点2、Select文も期間を指定する必要があります。
でないと、指定期間以外も出力します。
注意点3、Distinct句を指定した方がいいです。
[会社コード], [品目コード]の組合せの重複出力を回避できます。
以上、補足しておきます
ありがとうございます
出荷数0の時の扱いの説明が不足していた事に気がつきました
詳しくはNo4さんのところに書いています
やりたい事の半分はできたのですが・・・
No.2
- 回答日時:
元データテーブルからクエリを作成して、フィールド欄に下記の式を設定すればいいでしょう。
平均出荷数: DSum("出荷数","元データ","会社コード='" & [会社コード] & "' AND 品目コード='" & [品目コード] & "' AND 月度 Brtween " & Format(DateAdd("m",-3,Format([月度],"0000\/00")),"yyyymm") & " AND " & [月度])/3
ありがとうございます
出荷数0の時の扱いの説明が不足していた事に気がつきました
詳しくはNo4さんのところに書いています
やりたい事の半分はできたのですが・・・
No.1
- 回答日時:
【出荷履歴】
1_|A00000001|AAAAAAA|201408|10
2_|A00000001|AAAAAAA|201409|20
3_|A00000001|AAAAAAA|201410|30
4_|B00000002|BBBBBBB|201408|10
5_|B00000002|BBBBBBB|201409|20
6_|B00000002|BBBBBBB|201410|30
7_|C00000003|CCCCCCC|201408|10
8_|A00000001|AAAAAAA|201411|10
【Step1】
SELECT DISTINCT 会社コード, 品目コード
FROM 出荷履歴;
<結果>
A00000001|AAAAAAA
B00000002|BBBBBBB
C00000003|CCCCCCC
さて、このSQL文に
同じ会社コードと商品コードを持つ行の出荷数の合計をBETWEENで期間を指定して3で除して四捨五入すれば、添付図のような結果を得ることができると思いますよ。少し課題があるとすれば、AccessのRound()は銀行型丸めで四捨五入ではないことです。ですから、仮に四捨五入したい場合は、以下のような Rounds() を標準モジュールに付加する必要があります。
Public Function Rounds(ByVal M As Currency, _
ByVal A As Integer, _
Optional D As Integer = 0) As Variant
Dim R As Currency
Select Case A
Case 0 ' 四捨五入
R = Fix(M * 10 ^ D + 0.5@)
Case 1 '切り捨て
R = Fix(M * 10 ^ D)
Case 2 ' 切り上げ
If Int(M) <> M Then
R = Fix(M * 10 ^ D) + 1 * 10 ^ D
Else
R = Fix(M * 10 ^ D)
End If
End Select
Rounds = Sgn(M) * (R / 10 ^ D)
End Function
なお、私の解釈で合っていれば添付図のSQL文を補足します。ただ、
月度 BETWEEN '201408' AND '201410'
と、集計月度の期間データはSQLに埋め込んでいます。
![「accessで移動平均する方法」の回答画像1](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/8/1232063_5497ecd249399/M.jpg)
ありがとうございます
出荷数0の時の扱いの説明が不足していた事に気がつきました
詳しくはNo4さんのところに書いています
やりたい事の半分はできたのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】ファイル名の日付によって、保管するフォルダを、自動選択したい 4 2023/08/16 11:24
- Amazon クロネコヤマトの集荷を依頼した場合ネコピットは利用できますか? 1 2023/05/21 19:02
- 会社・職場 ある時、 会社で見積書の依頼を メールで対応してる時の出来事。 見積書な項目8行目の文言が 長すぎる 2 2023/06/10 03:12
- Excel(エクセル) マクロでPDFを印刷する方法 3 2023/02/15 09:40
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) VBAで質問があります 1 2022/10/19 10:32
- 作詞・作曲 或る曲の楽譜のコード進行の中に"F onA"なるものがありました。これはどんな和音ですか? 7 2023/05/22 00:34
- アジア 今月、成田からマレーシアへANAで旅行予定です。 荷物に付いてよくわからないので教えて下さい。 お預 1 2022/07/12 19:11
- その他(暮らし・生活・行事) 引っ越し荷物の一時預かり 2 2022/07/04 23:24
- その他(Microsoft Office) EXCEL VLOOKUPに関する質問 5 2023/02/08 11:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
ACCESS インポート時の重複チ...
-
DB2で助けてください!
-
連番のMin, Maxを取得したい
-
請求と入金のテーブルの作成の...
-
アクセスのリレーションシップ
-
sqlで質問です。 Aテーブルは店...
-
【Access】順位を付けたい
-
Inner join と Left joinの明...
-
行方向のデータを横に並べる
-
Accessユニオンクエリーで2つ...
-
SQL文で2つのSELCT文の結果を...
-
[ BETWEEN ] vs [ >= AND <= ]
-
ACCESSのSQLで、NULLかNULLでな...
-
【SQLServer】IS NULLのパフォ...
-
クエリのキャンセルがいつにな...
-
エクスポート時の改行コードに...
-
データの二重表示の原因
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
ACCESS 一つのフィールドに複...
-
商品コード番号を入力すると商...
-
行方向のデータを横に並べる
-
PLSQLの識別子エラー
-
Inner join と Left joinの明...
-
片方だけ抽出する方法(SQL)
-
SQL 2つのテーブルとSUBSTRING...
-
Accessユニオンクエリーで2つ...
-
主キーの変更
-
Accessでフィールドを比較した...
-
SQL文について(片方のテーブル...
-
続.ORACLEのSELECTのソートに...
-
場合によって条件を変えるSQL
-
請求と入金のテーブルの作成の...
-
sqlのupdate文で質問です。 テ...
-
[Oracle] UPDATE分の副問い合わ...
-
accessで移動平均する方法
おすすめ情報