職員や備品の異動を順次記録し、必要に応じ指定した時点での状態(その時点で誰(何)がどこに属していたのか)を抽出するという例についてです。
正規化関連の記事(こちら)でも触れていますが、設計上のFAQですので改めて簡単に紹介します。
異動履歴の記録例
まずは職員の異動記録を例としたテーブルの作成例です。
最低限必要なのは職員テーブルと…
このような異動テーブルです。
1人の職員の1回の異動のたびに1つのレコードが加わるつくりになっています。
最も古い異動日が2016/4/1でその日のレコードが5つあることから、この日に5人でいわば操業を開始し、以降異動(職員番号6以降の新規採用含む)のたびにレコードが加わっていることが読み取れるかと思います。
なお、さらに部署テーブルも分けるのが通常ですがここでは簡略に留めます。
直近のデータ抽出例
上記のテーブルから最新の職員配置状況を抽出する例です。
まずこのようなクエリを作ります。
職員ごとに最大の日付、つまり最も新しい異動の日付を求める、というわけです。
データシートビューはこうなります。
つぎにもう1つクエリをつくり、2つのテーブルのほかさっき作ったクエリを表示させ、このように設定します。
各職員ごとの直近の異動に係るデータだけが抽出されるというわけです。
データシートビューです。
これが最新の配置状況となります。
指定時点でのデータ抽出例
上記のテーブルから、(過去の)指定した時点での配置状況を抽出する例です。時点の指定はパラメータクエリ(つまりダイアログ)で行わせるものとします。
まずは上記のように2つのクエリをつくりますが、最初のクエリをこのようにします。「異動日の最大」列とは別に「異動日」列を設け、「集計」は「Where条件」に、「表示」はOffに、
「抽出条件」は「<=[抽出指定日]」とします。つい「異動日の最大」列に条件を付けてしまいそうになりますが、それでは(HAVING条件となるため)うまく抽出できません。慣れても間違いやすいところです。
あとは2つ目のクエリを上記と同じようにつくってください。
そして2つ目のクエリを開き、ダイアログに任意の日付を入力します。
データシートビューです。
これが2017/3/20時点での配置状況です。
参考:サブクエリの利用
上記の例ではわかりやすくクエリを2つ使っていますが、サブクエリを使えば1個で済みます。
2番目の例についてこのようなクエリを作り、抽出条件欄に次のように記せばOKです。
(SELECT Max([異動日]) FROM 社員テーブル AS 社員テーブル_1,異動テーブル AS 異動テーブル_1 WHERE 社員テーブル_1.社員番号 = 異動テーブル_1.社員番号 AND 社員テーブル_1.社員番号 = 社員テーブル.社員番号 AND 異動テーブル_1.異動日<=[抽出指定日])