例
開始日 終了日 単価
2021/08/01 Null 150
2021/08/05 2021/08/10 120
2021/08/20 Null 140このようなデータで日付を指定した際に
指定日付 2021/08/01 ~ 2021/08/04 基準開始日 2021/08/01 単価150
指定日付 2021/08/05 ~ 2021/08/10 基準開始日 2021/08/05 単価120
指定日付 2021/08/11 ~ 2021/08/19 基準開始日 2021/08/01 単価150
指定日付 2021/08/20 ~ 基準開始日 2021/08/20 単価140
と基準開始日と単価が返ってくるようにしたいのです
私個人は、hirotonさんやhatenaさんと同じく
ソリューションとしては 圧倒的に
{ テーブルデータの保有形式を変更 } >>> { トリッキーな SQL または VBA }
という見解です。
ただ Access の一般機能で「 実現可能 」な ご要望であることも事実ですから
実用性とパフォーマンスは度外視で、SQL( クエリ )のサンプル を載せておきます。
( ※ 今回の投稿はテーブル定義とデータ例のみ )
なお、( 何らかの )日付範囲の抽出条件を満たした後のデータが
「 例 」の3行であるとするなら
「 指定日付 」に該当するような パラメータなりリテラル値は
開始日フィールドに指定された可能性が高いと推測し、
私の回答( SQL )では、現状のテーブルデータに影響を与えない抽出条件として
開始日 >= dateserial( year( date() ), month( date() ), 1 )
を指定しています。
■テーブル: 単価マスタ
CREATE TABLE 単価マスタ
(
rid counter not null primary key
, 開始日 datetime not null
, 終了日 datetime
, 単価 money not null
);
rid | 開始日 | 終了日 | 単価 |
---|---|---|---|
1 | 2021/08/01 | 150 | |
2 | 2021/08/05 | 2021/08/10 | 120 |
3 | 2021/08/13 | 100 | |
4 | 2021/08/20 | 2021/08/22 | 140 |
5 | 2021/08/24 | 15 | |
6 | 2021/08/28 | 30 |
■テーブル: T_num
CREATE TABLE T_num ( num int not null primary key );
( T_num テーブル の num には 0 ~ 9 までの数値を入力 )
num | |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 |
( 続き )
# 最初は SQLの一筆書きを投稿しようとしたところ
# 160行の記述が長すぎて投稿不可であったことと
# サブクエリのネストが深くて、記述が複雑怪奇になったため、
# 構造別にクエリを複数( 計7つ )作るという回答に切り替えました。
まぁ...個々の記述が短いと 最終結果が出るまでの工程も分かりやすいでしょう。
( クエリを作る順番も、掲載した順と同じになります )
q_base
q_ymd
q_ymdlist
( 続き )
q_fromto
q_highlow
q_union
q_result