Microsoft Access 掲示板

「クエリが複雑すぎます」を回避したい / 6

14 コメント
views
4 フォロー
6
hiroton 2021/09/17 (金) 09:48:11 36d08@f966d

基本的にはクエリを分ける必要はなく、それぞれの入力からそのレコードがどの勤務形態なのかを判定してその時の対応するフィールドの値を取ってこればいいです。
テクニックとして、それぞれの入力が排他的であればそれぞれの時間を合計してあげればほしい時間になります

No通常勤務開始時間休日勤務開始時間フレックス開始時間
18:20
210:00
313:00

↓そのまま開始時間同士を合計する(データなし(Null)は0とする)

NO開始時間
18:20
210:00
313:00

通常勤務の時間は残業時間によって変わるので、この計算の前に残業時間を考慮したデータ上の開始時間を作成します。

通常勤務開始時間: IIf([残業3開始]<[平日開始時間],[残業3開始],Nz([残業1開始],[平日開始時間]))

これらを組み合わせればクエリを分けることなくそれぞれの時間を求めることができます。

開始時間: Nz(IIf([残業3開始]<[平日開始時間],[残業3開始],Nz([残業1開始],[平日開始時間])),0)+Nz([休日1開始時間],0)+Nz([フレックス開始],0)

休日については扱いに不明点があります。>> 5に要点をまとめているので確認してください。それに合わせて事前にデータの整形が必要になります
たぶん、休日2のあるレコードだけ抽出してUNIONすることになるんじゃないかと予想しています

あと、残業3が出るというのは残業と残業の間に中抜けがありそうですがどうなんでしょう?具体的なデータでほしい結果を考えてみてください

もう一つ、フレックスって時間休ないんですかね。扱い的には休日みたいに複数レコード発生とかしてそうですけど(データ処理的には問題ない)

通報 ...
  • 9
    ひんやり 2021/09/17 (金) 10:36:09 8be4a@c8e67 >> 6

    クエリを考えるのに必死になりすぎて、NZの存在を忘れていました・・・。
    ちょっと見直します。

    あと、残業3が出るというのは残業と残業の間に中抜けがありそうですがどうなんでしょう?具体的なデータでほしい結果を考えてみてください

    残業と残業の間で中抜けは発生しないと思われます。
    分析してみましたが、残業開始から早朝帯や深夜帯に入ると残業3が入っているように見えます。

    もう一つ、フレックスって時間休ないんですかね。扱い的には休日みたいに複数レコード発生とかしてそうですけど(データ処理的には問題ない)

    時間休あります。
    平日の普通の勤務と同じ、時間休開始、時間休終了で中抜けを判別しています。
    フレックス専用で時間休を値が入るところはないです。

    10
    hiroton 2021/09/17 (金) 11:12:09 36d08@f966d >> 9

    NzはNullを判定するだけなんでIIf条件分岐でIsNull判定するのと同じですけどね。式が短く書けるだけです(大事)

    残業3は残業代の切り替わりをわかりやすくしてるだけかな?データ上では意味ないですが業務上ではよくある話ですかね

    休日2がある場合に中抜け扱いとすると、平日の時間休に申請があるとき、申請上の時間合計とデータ上の中抜けの時間合計が合わないってことになります。
    休日のデータには休日フラグを立てて、そのレコードは集計から省くようにすれば問題ないんですが、hiroton的には元データから存在しないような作りのほうが好きですね
    休日1と休日2の間には中抜けがあるけど休日2と休日3(2レコード目の休日1)の間には中抜けがないっていうのも混乱のもとですし

    ちょっと挙げたようにUNION使えばできないことでもないですが、ほしい結果次第ですかね。今回は使わなくてもよさそうでそのほうが高速そうでもあります。

    >> 8にイメージを出していますが、「休日2発生時は中抜け扱いをする」ならフィールドの位置をうまい具合に入れ替えるような条件判断を作ってあげればいいので考えてみてください

  • 11
    hiroton 2021/09/17 (金) 14:25:05 36d08@f966d >> 6

    項が分かれていたほうが入れ子少なくてわかりやすいかと思ったけど

    開始時間: Nz(IIf([残業3開始]<[平日開始時間],[残業3開始],Nz([残業1開始],[平日開始時間])),0)+Nz([休日1開始時間],0)+Nz([フレックス開始],0)
    ↓
    開始時間: Nz(IIf([残業3開始]<[平日開始時間],[残業3開始],Nz([残業1開始],[平日開始時間])),Nz([休日1開始時間],[フレックス開始]))
    
    勤務終了: Nz(IIf([残業3終了]>[平日終了時間],[残業3終了],Nz([残業2終了],[平日終了時間])),Nz(Nz([休日2終了],[休日1終了]),[フレックス終了]))
    

    長くてもこのくらいなら全部Nzの入れ子の形でも問題なさそう

    13
    ひんやり 2021/09/17 (金) 15:13:24 8be4a@c8e67 >> 11

    おお、なるほど。
    お二人の回答を見て大分回りくどいことをやっていたことに気づきました。
    かなりごてごて書き込んでしまっているので、少し中身を見直してみます。