( 続き )
# 最初は SQLの一筆書きを投稿しようとしたところ
# 160行の記述が長すぎて投稿不可であったことと
# サブクエリのネストが深くて、記述が複雑怪奇になったため、
# 構造別にクエリを複数( 計7つ )作るという回答に切り替えました。
まぁ...個々の記述が短いと 最終結果が出るまでの工程も分かりやすいでしょう。
( クエリを作る順番も、掲載した順と同じになります )
- SQL文
- クエリ名
- SQLの結果セット
SELECT 開始日
, cdate(
nz(
x.終了日
, nz(
(
SELECT min( 開始日 ) - 1
FROM 単価マスタ y
WHERE y.開始日 >= dateserial( year( date() )
, month( date() )
, 1
)
AND y.開始日 > x.開始日
)
, dateserial( 2099, 12, 31 )
)
)
) As 終了日
, 単価
FROM 単価マスタ x
WHERE 開始日 >= dateserial( year( date() ), month( date() ), 1 ) ;
q_base
開始日 | 終了日 | 単価 |
---|---|---|
2021/08/01 | 2021/08/04 | 150 |
2021/08/05 | 2021/08/10 | 120 |
2021/08/20 | 2021/08/22 | 140 |
2021/08/13 | 2021/08/19 | 100 |
2021/08/24 | 2021/08/27 | 15 |
2021/08/28 | 2099/12/31 | 30 |
SELECT dateadd( 'd', x.num + y.num * 10, z.d_min ) As ymd
FROM T_num x
, T_num y
, (
SELECT min( 開始日 ) As d_min
, datediff( 'd', min( 開始日 ), max( 開始日 ) ) As d_count
FROM 単価マスタ
WHERE 開始日 >= dateserial( year( date() ), month( date() ), 1 )
) z
WHERE x.num + y.num * 10 < z.d_count ;
q_ymd
ymd | |
---|---|
2021/8/1 | |
2021/8/2 | |
2021/8/3 | |
( 省略) | |
2021/8/25 | |
2021/8/26 | |
2021/8/27 |
SELECT x.ymd
FROM q_ymd x
LEFT JOIN q_base y
ON ( ( x.ymd between y.開始日 and y.終了日 ) )
WHERE y.開始日 Is Null ;
q_ymdlist
ymd | |
---|---|
2021/8/11 | |
2021/8/12 | |
2021/8/23 |
通報 ...
( 続き )
q_fromto
q_highlow
q_union
q_result