좀 복잡한(?) 쿼리 문제 입니다. 0 5 4,095

by 바람이불면 [SQL Query] SQL 쿼리 기간 [2014.09.11 15:44:58]


안녕하세요.

아래와 같이 제품 정보가 있을 경우

제품코드 판매시작일 판매종료일
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를 연결해서 만들어야할까요?

 

by 우리집아찌 [2014.09.11 16:13:19]
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

 


by 바람이불면 [2014.09.11 16:19:39]

감사합니다. =)


by 아발란체 [2014.09.11 16:38:33]

제품코드가 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
  제품코드, 기준일
;

 


by jkson [2014.09.11 16:46:48]
WITH t(code, sdt, edt) AS
(
SELECT 제품코드
     , trunc(판매시작일,'MM')
     , trunc(판매종료일,'MM')
  FROM 제품정보
  UNION ALL
SELECT code
     , add_months(sdt,1)
     , edt 
  FROM t
WHERE add_months(sdt,1) <= edt
)
SELECT code, to_char(sdt,'YYYY-MM')
  FROM t
 ORDER BY code, sdt;

 


by 아발란체 [2014.09.12 09:07:35]

배워갑니다 ~ 보기는 편한데, 생각처럼 응용하기에는 쉽지 않네용. 무한 루프... = ㅅ =)ㆀ

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