・テーブル[入居者マスタ]において、
フィールド[部屋ID]と[入居日]の値の組み合わせは
必ず一意となり、他のレコードと競合することはない。
( 1 つの部屋について、入居日が別の入居者と重なることはない)
・フィールド[部屋ID]の値が同じであるグループにおいて、
[入居日]と[退室日]によって示されるそれぞれの入居期間が、
他のレコードのそれと競合/矛盾することはない。
(例えば「 2013/04/01 から 2016/03/31 までの間に
A さんが 101 号室に入居していた」という(正しい)履歴に対し、
「B さんが 101 号室に 2015/04/01 から入居中である」という
(前者と矛盾する)履歴が登録されるような状態になることが
あり得ない仕組みになっている)
・(上記と同様の仕組みにより)
フィールド[部屋ID]の値が同じであるグループにおいて、
[退室日]の値が Null となり得るレコードは、
[入居日]の値が最大であるレコード 1 件
(そのグループにおける最後の入居者 1 人)のみ
となるようにしている。
・テーブル[入居者マスタ]のフィールド[入居日]に、
システム日付より未来の日付(入居予定日)が入力されている
(事前の入居予約をデータとして登録する)ケースは考慮しない。
・テーブル[入居者マスタ]のフィールド[退室日]に、
システム日付より未来の日付(退室予定日)が入力されている
(事前の解約申請をデータとして登録する)ケースは考慮しない。
単純に、[退室日]の値が Null であるレコードに
記録されている入居者を「各部屋における現在入居中の住人」とみなす。
とりあえず、以上のような前提であると仮定します。
- [入居者マスタ]を元に以下のような選択クエリ
(以下[Q_現在入居者])を作成する。
( SQL ビュー)
SELECT [入居者マスタ].*
FROM [入居者マスタ]
WHERE NOT EXISTS (SELECT tmp.*
FROM [入居者マスタ] tmp
WHERE tmp.[部屋ID] = [入居者マスタ].[部屋ID]
AND tmp.[入居日] > [入居者マスタ].[入居日])
AND [入居者マスタ].[退室日] IS NULL;
- 更に以下のような選択クエリを作成する。
( SQL ビュー)
SELECT [部屋マスタ].[マンションID],
[マンションマスタ].[マンション名],
[部屋マスタ].[部屋ID],
[部屋マスタ].[部屋名],
[Q_現在入居者].[入居者番号],
[Q_現在入居者].[入居者氏名],
[Q_現在入居者].[入居日],
[Q_現在入居者].[退室日],
IIf([Q_現在入居者].[入居者番号] IS NULL,
"空室",
"入居中") AS [入居状況]
FROM ([部屋マスタ]
INNER JOIN [マンションマスタ]
ON [部屋マスタ].[マンションID] = [マンションマスタ].[マンションID])
LEFT JOIN [Q_現在入居者]
ON [部屋マスタ].[部屋ID] = [Q_現在入居者].[部屋ID]
ORDER BY [部屋マスタ].[マンションID],
[部屋マスタ].[部屋ID];
基本的には、以上のような手順で
各クエリを作成なさればよろしいでしょう。