쿼리 문의 드립니다. 0 3 186

by 여리당 [SQL Query] [2020.02.12 17:11:48]


A테이블 a의날짜 컬럼이 있고 b,c,d,e 컬럼에 임의의 값이 있는 테이블이 있습니다.

a b c d e f
2/1 A 1 1 1 1
2/1 B 2 2 2 2
2/4 F 3 3 3 3
2/10 B 50 50 50 50
2/10 C 60 60 60 60

결과. 일자가 A테이블 일자보다 작거나 같은 일자의 값을 셋팅하는 결과가 나오도록 하는데 어렵네요;;

일자 a b c d e f
2/1 2/1 A 1 1 1 1
2/1 2/1 B 2 2 2 2
2/2 2/1 A 1 1 1 1
2/2 2/1 B 2 2 2 2
2/3 2/1 A 1 1 1 1
2/3 2/1 B 2 2 2 2
2/4 2/4 F 3 3 3 3
2/5 2/4 F 3 3 3 3
2/6 2/4 F 3 3 3 3
2/7 2/4 F 3 3 3 3
2/8 2/4 F 3 3 3 3
2/9 2/4 F 3 3 3 3
2/10 2/10 B 50 50 50 50
2/10 2/10 C 60 60 60 60
2/11 2/10 B 50 50 50 50
2/11 2/10 C 60 60 60 60
2/12 2/10 B 50 50 50 50
2/12 2/10 C 60 60 60 60
2/13 2/10 B 50 50 50 50
2/13 2/10 C 60 60 60 60
2/14 2/10 B 50 50 50 50
2/14 2/10 C 60 60 60 60

고수님들 도와주세요~~

by 마농 [2020.02.12 17:27:29]

1. 검색기간이 조건으로 주어지는 거겠죠?
 - 기간조건 : '20200201' ~ '20200214'
 - 연월조건 : '202002'
2. 검색기간이 '20200203' ~ 로 주어졌을 경우?
 - '20200203' 자료는 NULL 이 나와야 할까요?
 - '20200203' 이전 일자인 '20200201' 의 자료가 나와야 할까요?
3. DB 종류에 따라, 버전에 따라, 쿼리 문법이 달라집니다.
 - DB 종류 및 버전을 알려주세요.


by 여리당 [2020.02.12 17:41:31]

기간 조회를 해야하구요~

20200203은 A테이블을 참조해서 20200201 값이 나와야합니다.

DB는 오라클 11g 사용중이구요~


by 마농 [2020.02.13 08:25:55]
WITH t AS
(
SELECT '20200201' a, 1 b, 1 c, 1 d, 1 e FROM dual
UNION ALL SELECT '20200204', 3, 3, 3, 3 FROM dual
UNION ALL SELECT '20200210', 5, 5, 5, 5 FROM dual
)
SELECT *
  FROM (SELECT dt
             , LAST_VALUE(a) IGNORE NULLS OVER(ORDER BY dt) a
             , LAST_VALUE(b) IGNORE NULLS OVER(ORDER BY dt) b
             , LAST_VALUE(c) IGNORE NULLS OVER(ORDER BY dt) c
             , LAST_VALUE(d) IGNORE NULLS OVER(ORDER BY dt) d
             , LAST_VALUE(e) IGNORE NULLS OVER(ORDER BY dt) e
          FROM (SELECT TO_CHAR(s + LEVEL - 1, 'yyyymmdd') dt
                  FROM (SELECT TO_DATE(MAX(a), 'yyyymmdd') s
                             , TO_DATE(:edt  , 'yyyymmdd') e
                          FROM t
                         WHERE a <= :sdt
                        )
                 CONNECT BY LEVEL <= e - s + 1
                ) a
             , t b
         WHERE a.dt = b.a(+)
        )
 WHERE dt >= :sdt
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입