異動履歴の記録と任意時点でのデータ抽出例

 職員や備品の異動を順次記録し、必要に応じ指定した時点での状態(その時点で誰(何)がどこに属していたのか)を抽出するという例についてです。
 正規化関連の記事(こちら)でも触れていますが、設計上のFAQですので改めて簡単に紹介します。

異動履歴の記録例

f:id:accs2014:20191022194006p:plain:right:w400


 まずは職員の異動記録を例としたテーブルの作成例です。
 最低限必要なのは職員テーブルと…

f:id:accs2014:20191022194009p:plain:right:w600

 このような異動テーブルです。
 1人の職員の1回の異動のたびに1つのレコードが加わるつくりになっています。
 最も古い異動日が2016/4/1でその日のレコードが5つあることから、この日に5人でいわば操業を開始し、以降異動(職員番号6以降の新規採用含む)のたびにレコードが加わっていることが読み取れるかと思います。

 なお、さらに部署テーブルも分けるのが通常ですがここでは簡略に留めます。

直近のデータ抽出例

f:id:accs2014:20191022194014p:plain:right:w650:right:w400

 上記のテーブルから最新の職員配置状況を抽出する例です。
 まずこのようなクエリを作ります。
 職員ごとに最大の日付、つまり最も新しい異動の日付を求める、というわけです。

f:id:accs2014:20191022194017p:plain:right:w300


 データシートビューはこうなります。

f:id:accs2014:20191022194021p:plain:right:w600

 つぎにもう1つクエリをつくり、2つのテーブルのほかさっき作ったクエリを表示させ、このように設定します。
 各職員ごとの直近の異動に係るデータだけが抽出されるというわけです。

f:id:accs2014:20191022194026p:plain:right:w550


 データシートビューです。
 これが最新の配置状況となります。

指定時点でのデータ抽出例

f:id:accs2014:20191022194031p:plain:right:w500

 上記のテーブルから、(過去の)指定した時点での配置状況を抽出する例です。時点の指定はパラメータクエリ(つまりダイアログ)で行わせるものとします。
 まずは上記のように2つのクエリをつくりますが、最初のクエリをこのようにします。「異動日の最大」列とは別に「異動日」列を設け、「集計」は「Where条件」に、「表示」はOffに、
「抽出条件」は「<=[抽出指定日]」とします。つい「異動日の最大」列に条件を付けてしまいそうになりますが、それでは(HAVING条件となるため)うまく抽出できません。慣れても間違いやすいところです。
 あとは2つ目のクエリを上記と同じようにつくってください。



f:id:accs2014:20191022194037p:plain:right:w300

 そして2つ目のクエリを開き、ダイアログに任意の日付を入力します。

f:id:accs2014:20191022194040p:plain:right:w600

 データシートビューです。
 これが2017/3/20時点での配置状況です。

参考:サブクエリの利用

f:id:accs2014:20191022194043p:plain:right:w650

 上記の例ではわかりやすくクエリを2つ使っていますが、サブクエリを使えば1個で済みます。
 2番目の例についてこのようなクエリを作り、抽出条件欄に次のように記せばOKです。

(SELECT Max([異動日]) FROM 社員テーブル AS 社員テーブル_1,異動テーブル AS 異動テーブル_1 WHERE 社員テーブル_1.社員番号 = 異動テーブル_1.社員番号 AND 社員テーブル_1.社員番号 = 社員テーブル.社員番号 AND 異動テーブル_1.異動日<=[抽出指定日])