Microsoft Access 掲示板

連続する日付の7番目以降を取り出したい

6 コメント
views
4 フォロー

hatena様 皆様 お世話になります。

hatena様の「月単位でデータ入力する場合の日付入力の効率的なUIを考える」
(https://hatenachips.blog.fc2.com/blog-entry-438.html)
のデータを利用しています。

こちらの記事の後半に出てくる、出勤関係のテーブル
「T_社員」と「T_出退勤」を利用しています。

この2つのテーブルデータを利用して下記のようなクエリを作りたいと考えています。
フィールド 社員CD 氏名 日付
抽出条件 同じ人が、連続して7日以上出勤している場合の7日以降の日付

count関数や、DAY関数やbetweenなどで色々と挑戦してみたですが、
うまくいかなかったためご教授いただければ幸いに存じます。

お手数をお掛けしますが、よろしくお願いいたします。

ゆか
作成: 2019/06/06 (木) 09:51:22
通報 ...
1
名前なし 2019/06/06 (木) 12:57:29 f52ac@f966d

条件を指定してレコードを数える方法としてDCount関数が使えます。

「今日」を基準として7日間の出勤記録が7個あればいいので、新しく作るクエリにフィールドを追加して

今日まで7日間の出勤数: DCount("社員CD","T_出退勤","社員CD=" & [社員CD] & " and 日付>#" & [日付]-7 & "# and 日付<=#" & [日付] & "#")
抽出条件:7

とすれば抽出できます。
※出退勤の記録は1日1回までを前提としています。中休みを入れて午前午後で2回記録がついたりするなんてことがある場合は日付をグループ化したりする必要が出ると思います。

別案
クエリで定義域集計関数を使うと重くなるので「T_出退勤」に連続出勤日数フィールドを用意して出退勤を記録するフォームで入力時に連続出勤日数を記録するといいと思います。

2
ゆか 2019/06/06 (木) 13:42:59 26d08@f2a60

早速お答えくださり、ありがとうございます。

新しいフィールドに、教えていただいた式を入力させていただいたのですが、
7日連続勤務ではない数字が出てきてしまう状況です。
危惧されている、一日2回入力することはない状況なのですが、
4日目で表示されてしまう人がいる状況です。

引き続き教えていただければ幸いに存じます。
どうぞ、よろしくお願いいたします。

3
名前なし 2019/06/06 (木) 16:53:46 f52ac@f966d

直接「T_出退勤」テーブルを見ているわけではないので何ともですが、間違って表示されてしまう人の条件でクエリを表示すると何かわかるかもしれません。

たとえば
間違って表示されてしまう人の社員CDが「3」
表示されてしまう4日目が「2019/5/16」
なら
新しく作ったフィールド(今日まで7日間の出勤数)の抽出条件を削除
社員CDの抽出条件に「3」
日付の抽出条件に「>#2019/05/16#-7 And <=#2019/05/16#」

として表示すると7件以上のレコードが表示されるはずです。
日付が重複しているレコードがあったり、7日間に含まれない日付があったりしませんか?

4
ゆか 2019/06/07 (金) 09:27:12 26d08@f2a60

ご回答ありがとうございます。

間違って表示されているパターンは下記の通りでした。
社員CD7  4月2週目  1、連続3日目
            2、連続4日目
      ※連続5日目は表示されていませんでした。

社員CD9  4月の最終週 1、連続3日目
             2、連続4日目
             3、連続5日目
      ※連続6日目は出勤自体がないため表示されていませんでした。
社員CD19  5月最終週  1、連続2日目
             2、連続1日目(1日休んだ後に出勤)
             3、連続2日目
その他にもパターンが全く違う社員が出ている状況です。
もちろん日付が重複しているレコードはない状態です。

賢くない私には、パターン化が見えない状況です。
非常にお手数を取らせてしまい申し訳ありませんが、
よろしくお願いいたします。

5
名前なし 2019/06/07 (金) 12:01:33 7f2b8@f966d

基本的な考え方は「7日間だけ抽出する」「連続して7日出勤しているなら7レコードあるはずだ」です。
連続3日ということは「4日前は休み=レコードがない」なのでその日までの7日分だけ抽出したら最大でも6レコードしかないはずで「抽出条件:7」で表示されるのはおかしいとなります。

Dcount関数の条件指定を正せばいいのですが、おかしい原因は

  1. 同じ日付が複数ある
  2. 「出勤」以外の日付のレコードがある
  3. 8日以上離れた日付がある

のどれかです。
そこで、おかしいレコードで「7日間だけ抽出する」して、抽出されたレコードを直接見て原因をつかもうというのが>> 3です。

社員CD7  4月2週目  1、連続3日目なら(月曜から出勤として対象日は4/10日)
社員CDの抽出条件に「7」
日付の抽出条件に「>#2019/04/10#-7 And <=#2019/04/10#」
でクエリを表示すると7レコード以上表示されるはずです。
この場合のSQLを記載しますので、新規にクエリを作成し、SQLビューで以下を張り付けてデータシートビューで確認してみてください。

SELECT [T_出退勤].[社員CD], [T_出退勤].日付
FROM T_出退勤
WHERE ((([T_出退勤].[社員CD])=7) AND (([T_出退勤].日付)>#4/10/2019#-7 And ([T_出退勤].日付)<=#4/10/2019#));

表示されたレコードに「おかしい結果」に該当するものがあった場合はそれを弾く条件の追加が必要です。
「おかしい結果」が無い場合はDcount関数の条件が間違っています。最初の式と同じものを記載しますのでコピーしてみてください。

今日まで7日間の出勤数: DCount("社員CD","T_出退勤","社員CD=" & [社員CD] & " and 日付>#" & [日付]-7 & "# and 日付<=#" & [日付] & "#")
6
ゆか 2019/06/07 (金) 13:14:20 26d08@f2a60

ありがとうございます!できました!

理解力が低い私のために、懇切丁寧に教えて下さり、本当にありがとうございました!
これで、カウントミスや間違った入力を見つけることができそうです。

誠にありがとうございました!