예약번호 | 일자 | 수량 |
ABCD00001 | 21 | 100 |
ABCD00001 | 14 | 50 |
ABCD00001 | 11 | 70 |
이런 TABLE이 있는데요...
예약번호 | 일자 | 수량 |
ABCD00001 | 21 | 100 |
ABCD00001 | 20 | 100 |
ABCD00001 | 19 | 100 |
ABCD00001 | 18 | 100 |
ABCD00001 | 17 | 100 |
ABCD00001 | 16 | 100 |
ABCD00001 | 15 | 100 |
ABCD00001 | 14 | 50 |
ABCD00001 | 13 | 50 |
ABCD00001 | 12 | 50 |
ABCD00001 | 11 | 70 |
ABCD00001 | .... | 70 |
ABCD00001 | 1 | 70 |
원하는 결과는 위와 같습니다.
즉 원테이블에서 사이 기간만큼 같은 ROW를 복사해줘야 되는데....생각보다 어렵네요 ㅠㅠ
일자는 항상 21~0까지 이며,,,원 table의 시작 일자는 항상 21부터 시작입니다.
WITH t AS ( SELECT 'ABCD00001' no, 21 dd, 100 cnt FROM dual UNION ALL SELECT 'ABCD00001', 14, 50 FROM dual UNION ALL SELECT 'ABCD00001', 11, 70 FROM dual ) SELECT b.no , a.dd , LAST_VALUE(b.cnt) IGNORE NULLS OVER(PARTITION BY b.no ORDER BY a.dd DESC) cnt FROM (SELECT LEVEL - 1 dd FROM dual CONNECT BY LEVEL <= 22) a LEFT OUTER JOIN t b PARTITION BY (b.no) ON a.dd = b.dd ;
WITH t AS ( SELECT 'ABCD00001' no, 21 dd, 100 cnt FROM dual UNION ALL SELECT 'ABCD00001', 14, 50 FROM dual UNION ALL SELECT 'ABCD00001', 11, 70 FROM dual ) SELECT * FROM t MODEL PARTITION BY (no) DIMENSION BY (dd) MEASURES (cnt) RULES (cnt[FOR dd FROM 21 TO 0 DECREMENT 1] = NVL(cnt[CV()], cnt[CV()+1])) ORDER BY no, dd DESC ;