Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2013)
開始日〜終了日のテーブル内容を、別テーブルに持ってくる
投稿日時: 18/10/02 16:04:02
投稿者: みょん

調べても良い方法がわからず、、質問させて下さい。
※調べ方が悪かったらスミマセン。。
ACCESSを使って以下のようなことをやりたいと考えているのですが、
 
▼Aテーブル
日時 |値
2018/10/01 12:00 |100
2018/10/01 20:00 |100
2018/10/02 04:00 |100
2018/10/02 12:00 |100
2018/10/02 20:00 |100
2018/10/03 04:00 |100
2018/10/03 12:00 |100
2018/10/03 20:00 |100
2018/10/04 04:00 |100
2018/10/04 12:00 |100
2018/10/04 20:00 |100
2018/10/05 04:00 |100
2018/10/05 12:00 |100
2018/10/05 20:00 |100
2018/10/06 04:00 |100
 
▼Bテーブル
開始日 |終了日 |キャンペーン
2018/09/30 12:00 |2018/10/03 11:59 |キャペーンA
2018/10/04 12:00 |2018/10/05 11:59 |キャペーンB
2018/10/06 18:00 |2018/10/09 11:59 |キャペーンC
 
のようなテーブルがあった場合、AとBを使って
 
▼結果
日時 |値 |キャンペーン
2018/10/01 12:00 |100 |キャペーンA
2018/10/01 20:00 |100 |キャペーンA
2018/10/02 04:00 |100 |キャペーンA
2018/10/02 12:00 |100 |キャペーンA
2018/10/02 20:00 |100 |キャペーンA
2018/10/03 04:00 |100 |キャペーンA
2018/10/03 12:00 |100 |なし
2018/10/03 20:00 |100 |なし
2018/10/04 04:00 |100 |なし
2018/10/04 12:00 |100 |キャペーンB
2018/10/04 20:00 |100 |キャペーンB
2018/10/05 04:00 |100 |キャペーンB
2018/10/05 12:00 |100 |なし
2018/10/05 20:00 |100 |なし
2018/10/06 04:00 |100 |なし
2018/10/06 18:00 |100 |キャペーンC
 
といった結果が欲しいのです。(AテーブルにBのキャンペーンを付ける)
※ルール上開始日〜終了日で各レコードで期間かぶることは無しとして、です。
 
実際のレコード件数はかなり大きく、なんとかACCESSクエリで出来ないものかと
考えているのですが、良い方法をご存知の方ご教授いただきたいです。

回答
投稿日時: 18/10/02 16:23:03
投稿者: sk

引用:
AテーブルにBのキャンペーンを付ける

引用:
※ルール上開始日〜終了日で各レコードで期間かぶることは無しとして、です。

( SQL ビュー)
---------------------------------------------------------------
SELECT [Aテーブル].[日時],
       [Aテーブル].[値],
       (SELECT TOP 1 tmp.[キャンペーン]
        FROM [Bテーブル] tmp
        WHERE [Aテーブル].[日時] Between tmp.[開始日]
                                     And tmp.[終了日]
        ORDER BY tmp.[終了日] DESC,
                 tmp.[開始日] DESC) AS [キャンペーン]
FROM [Aテーブル]
ORDER BY [Aテーブル].[日時];
---------------------------------------------------------------
 
以上のような選択クエリを作成なさればよろしいのではないかと。
 
引用:
▼結果
日時 |値 |キャンペーン

引用:
2018/10/06 18:00 |100 |キャペーンC

但し、このレコードは[Aテーブル]には存在しないので
返しようがありません。

投稿日時: 18/10/02 16:49:34
投稿者: みょん

sk様
 
早々に回答いただき、ありがとうございます!
 
なるほど。フィールド内でAテーブルの日時をBテーブルの開始日終了日内に該当する範囲の期間でBテーブルの終了日、開始日の降順で1番に出てくるキャンペーンを出すことが出来るのですね。(これならルール上でのミスがあっても最新日付のみで、レコードが重複したりしないので思ってた以上の答えです。)
こんな事が出来るなんて全然知りませんでした。。
 

引用:
▼結果
日時 |値 |キャンペーン
2018/10/06 18:00 |100 |キャペーンC
但し、このレコードは[Aテーブル]には存在しないので
返しようがありません。
こちらAテーブルの方の記載漏れでした。。申し訳ございません。
 
これでやりたい事が完璧に出来ます。感謝です!!