[ORACLE] 일자 단일행 여러행으로 만들기
꿍스뿡이의 드림빌더
ORACLE 날짜 레코드값을 여러행으로 보여주기
안녕하세요. 꿍스뿡이입니다!
ORACLE에서 가장 많이 사용하는것이 바로 날짜이지 않나 싶습니다.
그 중에서도 시작일자부터, 종료일자의 값을 여러행에 걸쳐 표현해야하는 경우가 있는데요.
다음의 2가지 방법을 활용하여 해당 이슈를 처리할 수 있습니다.
기본데이터 및 조건
CASE 1 : 시작일자 종료일자에 해당하는 일수만큼 데이터 ROW단위로 표현하기
1. 테이블명 : TEST
2. 대상칼럼 : START_DT(시작일자) VARCAHR2(8 BYTE)
END_DT(종료일자) VARCAHR2(8 BYTE)
3. 현재데이터
START_DT |
END_DT |
20190101 |
20190103 |
4. 변경하고자 하는 데이터
DT |
2019-01-01 |
2019-01-02 |
2019-01-03 |
CASE 2 : 키값을 기준으로, 시작일자 종료일자에 해당하는 일수만큼 데이터를 ROW단위로 각각 표현하기
1. 테이블명 : TEST
2. 대상칼럼 : BASE_KEY(키값) VARCHAR2(4 BYTE)
START_DT(시작일자) VARCAHR2(8 BYTE)
END_DT(종료일자) VARCAHR2(8 BYTE)
3. 현재데이터
BASE_KEY |
START_DT |
END_DT |
KEY1 |
20190101 |
20190103 |
KEY2 |
20190103 |
20190105 |
4. 변경하고자 하는 데이터
BASE_KEY |
DT |
KEY1 |
2019-01-01 |
KEY1 |
2019-01-02 |
KEY1 |
2019-01-03 |
KEY2 |
2019-01-03 |
KEY2 |
2019-01-04 |
KEY2 |
2019-01-05 |
처리방법
처리방법은 아래와 같습니다.
WITH부분을 수정하여 각자 상황에 맞게 사용하시면 될것 같습니다!
CASE1 : 시작일자 종료일자에 해당하는 일수만큼 데이터 ROW단위로 표현하기
WITH TEST AS
(SELECT '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL)
SELECT * FROM TEST;
WITH TEST AS
(SELECT '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL)
SELECT TO_CHAR(TO_DATE(START_DT, 'YYYYMMDD')+LEVEL-1, 'YYYY-MM-DD') AS DT
FROM TEST
CONNECT BY LEVEL <= (TO_DATE(END_DT, 'YYYYMMDD')-TO_DATE(START_DT, 'YYYYMMDD')+1)
CASE2 : 키값을 기준으로, 시작일자 종료일자에 해당하는 일수만큼 데이터를 ROW단위로 각각 표현하기
WITH TEST AS
(SELECT 'KEY1' AS BASE_KEY, '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL
UNION
SELECT 'KEY2' AS BASE_KEY, '20190103' AS START_DT, '20190105' AS END_DT FROM DUAL)
SELECT DISTINCT BASE_KEY,
TO_CHAR(TO_DATE(START_DT) + LEVEL -1 ,'YYYY-MM-DD') AS DT
FROM TEST
CONNECT BY LEVEL <= (TO_DATE(END_DT) - TO_DATE(START_DT) + 1)
ORDER BY BASE_KEY, DT
내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요!
내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!