お世話になります。
さっそくですが、表題の件でご相談させたください。
テーブルの素データ(労働時間データ)
対象月 | 氏名 | 時間 |
---|---|---|
2018/01/01 | AAAAA | 43.2 |
2018/01/01 | BBBBB | 42.1 |
2018/01/01 | CCCCC | 43.2 |
2018/02/01 | AAAAA | 33.6 |
2018/02/01 | BBBBB | 52.3 |
2018/02/01 | CCCCC | 23.8 |
2018/03/01 | AAAAA | 33.1 |
2018/03/01 | BBBBB | 42.5 |
2018/03/01 | CCCCC | 28.8 |
毎月、追加更新
社員数:約30,000人
対象期間:6ヶ月
クエリ(過去6ヶ月間の平均時間集計)
氏名 | 6ヶ月平均 | 5ヶ月平均 | 4ヶ月平均 | 3ヶ月平均 | 2ヶ月平均 | 当月 |
---|---|---|---|---|---|---|
AAAAA | 32.1 | 33.4 | 35.8 | 28.9 | 45.6 | |
BBBBB | 32.1 | 33.4 | 35.8 | 28.9 | 45.6 | |
CCCCC | 32.1 | 33.4 | 35.8 | 28.9 | 45.6 |
※氏名はDistinct表示
※当月日付(2018/12/01など)をパラメタで受け取り、2ヶ月〜6ヶ月間の平均を算出する
現状、○ヶ月平均はD系の演算クエリでやろうと思っていますが、
あまりにパフォーマンスが悪いのいでご相談させていただきました。
演算フィールドの例:
6ヶ月平均: Round(DAvg("[時間]","労働時間データ","氏名='" & [氏名] & "' and 対象年月 between DateAdd('m', -5, #" & [基準日を入力してください] & "#) and #" & [基準日を入力してください] & "#"),1)
スマホで書いてるので検証してなくて申し訳ありませんが
単純に今の書き方を踏襲するなら以下でいけるんじゃ無いですかね(年月のカラム名は対象年月が正しいとして)
select
氏名,
round(avg(時間),1) as 6ヶ月平均,
round(avg(iif(対象年月 between DateAdd('m', -4, cdate([基準日を入力してください])) and cdate([基準日を入力してください]),時間,null)),1) as 5ヶ月平均,
(各ヶ月)
from 労働時間データ
where 対象年月 between DateAdd('m', -5, cdate([基準日を入力してください])) and cdate([基準日を入力してください])
group by 氏名
でもこれ対象者のデータが抜けると平均にならない部分が出てくるので、
個人的にはsumして割る方が良いように思います
私も名前なしさんと同様のSQLにします。
名前なしさんと同じロジックですが、、、
変更点。
>=
だけでいい。(名前入れ忘れてました)
hatena 様
お手数かけて申し訳ありません。
まさにその辺修正しようと思って来たんですがもう直していただいていたとは…
パラメータの型指定もそんな形で出来たんですね。
別案
下記のテーブルを作成します。
T_連番
下記のクエリを作成。
Q_月繰り返し
出力例(パラメータに「2018/06/01」と入力)
このクエリと
労働時間データ
テーブルを結合してクロス集計クエリを作成すれば希望の結果になります。macof様、hatena様
ありがとうございます。
格段にパフォーマンスがアップいたしました。
ご指摘の通り、データがない場合、
平均値が正しく計算されないですね。
気づきませんでした。、
sumしてデータ件数で割るとした場合、
ゼロもしくはnullでないデータ件数はどう判定したらよいですか?
すみません、別案はまだ私の理解が及ばず試せていません。
データがない場合は、どのようにしたいのでしょうか。
例えば、1月、2月、5月、6月 のデータがある(3月、4月がない)場合の6か月平均は、
(1月+2月+5月+6月)/4
ですか。
あるいは、ない月は 0時間として、
(1月+2月+0+0+5月+6月)/6
ですか。
前者なら、
Avg
関数はNullを無視しますので、前回の回答のSQLでOKなはずです。後者の場合は、レコード無しだと複雑になるので、入力するときに、労働がない月も 0時間として入力するようにすれば、前回の回答でOKです。
hatena様
ありがとうございます。
前者です。Avg関数はnullを無視する仕様知りませんでした。勉強になりました。
これで解決です。どうもありがとうございました。