Microsoft Access 掲示板

一時的な日付範囲指定を含む日付データからの抽出 / 4

8 コメント
views
4 フォロー
4
mayu 2021/08/21 (土) 10:37:19 修正 ef559@a99f1


開始日     終了日     単価
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開始日終了日単価
12021/08/01150
22021/08/052021/08/10120
32021/08/13100
42021/08/202021/08/22140
52021/08/2415
62021/08/2830

  
  
■テーブル: 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
通報 ...
  • 5
    mayu 2021/08/21 (土) 10:38:13 修正 ef559@a99f1 >> 4

    ( 続き )

    # 最初は SQLの一筆書きを投稿しようとしたところ
    # 160行の記述が長すぎて投稿不可であったことと
    # サブクエリのネストが深くて、記述が複雑怪奇になったため、
    # 構造別にクエリを複数( 計7つ )作るという回答に切り替えました。

    まぁ...個々の記述が短いと 最終結果が出るまでの工程も分かりやすいでしょう。
    ( クエリを作る順番も、掲載した順と同じになります )

    • SQL文
    • クエリ名
    • SQLの結果セット

     

    q_base

    開始日終了日単価
    2021/08/012021/08/04150
    2021/08/052021/08/10120
    2021/08/202021/08/22140
    2021/08/132021/08/19100
    2021/08/242021/08/2715
    2021/08/282099/12/3130

     

    q_ymd

    ymd
    2021/8/1
    2021/8/2
    2021/8/3
     ( 省略)
    2021/8/25
    2021/8/26
    2021/8/27

     

    q_ymdlist

    ymd
    2021/8/11
    2021/8/12
    2021/8/23
    6
    mayu 2021/08/21 (土) 10:38:56 修正 ef559@a99f1 >> 5

    ( 続き )
     

    q_fromto

    d_fromd_to
    2021/08/112021/08/12
    2021/08/232021/08/23

     

    q_highlow

    d_fromd_tohighlow
    2021/08/112021/08/122021/08/012021/08/05
    2021/08/232021/08/232021/08/132021/08/20

     

    q_union

    d_fromd_to基準開始日補填行単価
    2021/08/112021/08/122021/08/011150
    2021/08/232021/08/232021/08/131100

     

    q_result

    指定開始日指定終了日基準開始日補填行単価
    2021/08/012021/08/042021/08/010150
    2021/08/052021/08/102021/08/050120
    2021/08/112021/08/122021/08/011150
    2021/08/132021/08/192021/08/130100
    2021/08/202021/08/222021/08/200140
    2021/08/232021/08/232021/08/131100
    2021/08/242021/08/272021/08/24015
    2021/08/282099/12/312021/08/28030