안녕하세요.
아래와 같이 제품 정보가 있을 경우
제품코드 | 판매시작일 | 판매종료일 |
A | 2010-01-20 | 2012-08-30 |
B | 2011-02-18 | 2012-07-11 |
프로젝트의 시작하는 기간으로 부터 종료기간까지 월을 표시하려고 합니다.
프로젝트 B를 예를 들면..
B 2011-02
B 2011-03
B 2011-04
B 2012-05
...
B 2012-08
이렇게 판매 시작 월부터 마지막 월까지를 출력하고 싶습니다.
매달 판매량을 표시하기 위한 쿼리에 사용할 예정인데, 시작/종료가 일정하지 않아서 쿼리에 카테시안 곱을 사용하기가 어려운 상황입니다.
어떻게 제품 Data와 기간 data를 연결해서 만들어야할까요?
SELECT VAL , TO_CHAR(ADD_MONTHS(TO_DATE(START_DT,'YYYY-MM-DD') , LV -1),'YYYY-MM') YYYYMM , LV , MONTHS_BETWEEN(TO_DATE(SUBSTR(END_DT,1,7),'YYYY-MM') , TO_DATE(SUBSTR(START_DT,1,7),'YYYY-MM')) FROM ( SELECT 'A' VAL, '2010-01-20' START_DT, '2012-08-30' END_DT FROM DUAL UNION ALL SELECT 'B' , '2011-02-18' , '2012-07-11' FROM DUAL ) A , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 100 ) B WHERE MONTHS_BETWEEN(TO_DATE(SUBSTR(END_DT,1,7),'YYYY-MM') , TO_DATE(SUBSTR(START_DT,1,7),'YYYY-MM')) >= B.LV - 1 ORDER BY 1 , 2
제품코드가 2개가 아닌 유동적이라면
WITH T AS ( SELECT 'A' AS 제품코드, '2010-01-20' AS 판매시작일, '2012-08-30' AS 판매종료일 FROM DUAL UNION ALL SELECT 'B','2011-02-18','2012-07-11' FROM DUAL UNION ALL SELECT 'C','2012-02-18','2012-12-11' FROM DUAL ) SELECT T2.제품코드, TO_CHAR(TO_DATE(기준일), 'YYYY-MM') AS 기준일 FROM ( SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(sd), LEVEL - 1), 'YYYY-MM-DD') AS 기준일 FROM ( SELECT MIN(판매시작일) AS sd, MAX(판매종료일) AS ed FROM T ) CONNECT BY ADD_MONTHS(LAST_DAY(sd), LEVEL - 1) <= LAST_DAY(ed) ) T1, (SELECT 제품코드, 판매시작일, TO_CHAR(LAST_DAY(판매종료일), 'YYYY-MM-DD') AS 판매종료일 FROM T) T2 WHERE 1 = CASE WHEN(기준일 >= 판매시작일 AND 기준일 <= 판매종료일) THEN 1 ELSE 0 END ORDER BY 제품코드, 기준일 ;