CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20181215','YYYYMMDD') , -12),'2018') FROM DUAL) || '1216' AND '20180115' THEN 1 ELSE 0 END AS M1
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180116' AND '20180215' THEN 1 ELSE 0 END AS M2
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180216' AND '20180315' THEN 1 ELSE 0 END AS M3
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180316' AND '20180415' THEN 1 ELSE 0 END AS M4
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180416' AND '20180515' THEN 1 ELSE 0 END AS M5
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180516' AND '20180615' THEN 1 ELSE 0 END AS M6
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180616' AND '20180715' THEN 1 ELSE 0 END AS M7
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180716' AND '20180815' THEN 1 ELSE 0 END AS M8
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180816' AND '20180915' THEN 1 ELSE 0 END AS M9
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20180916' AND '20181015' THEN 1 ELSE 0 END AS M10
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20181016' AND '20181115' THEN 1 ELSE 0 END AS M11
,CASE WHEN TO_CHAR(A.REGIST_DATE,'YYYYMMDD') BETWEEN '20181116' AND '20181215' THEN 1 ELSE 0 END AS M12
월별 통계쿼리중 한부분 인데요.
위 쿼리를 mysql로 바꾸려는데 함수들을 뭘써야할까요.
Oracle : TO_CHAR(a.regist_date, 'yyyymmdd')
MySQL : DATE_FORMAT(a.regist_date, '%Y%m%d')
MySQL 에 dual 테이블은 없습니다. 제거하시면 됩니다.
기존 오라클 쿼리도 개선이 필요해 보입니다. 전체 쿼리 올려주시면 좋을 듯 하네요.
우선 아래와 같이 개선하시면 좋을 듯 합니다.
매번 함수를 12번 사용하여 between 하지 말고,
인라인뷰 안에서 함수는 한번만 사용하여 월정보를 추출한 뒤
인라인뷰 밖에서 추출 정보를 간단하게 사용하시는게 좋을 듯 하네요.
SELECT COUNT(CASE WHEN mm = '01' THEN 1 END) m01 , COUNT(CASE WHEN mm = '02' THEN 1 END) m02 , COUNT(CASE WHEN mm = '03' THEN 1 END) m03 , COUNT(CASE WHEN mm = '04' THEN 1 END) m04 , COUNT(CASE WHEN mm = '05' THEN 1 END) m05 , COUNT(CASE WHEN mm = '06' THEN 1 END) m06 , COUNT(CASE WHEN mm = '07' THEN 1 END) m07 , COUNT(CASE WHEN mm = '08' THEN 1 END) m08 , COUNT(CASE WHEN mm = '09' THEN 1 END) m09 , COUNT(CASE WHEN mm = '10' THEN 1 END) m10 , COUNT(CASE WHEN mm = '11' THEN 1 END) m11 , COUNT(CASE WHEN mm = '12' THEN 1 END) m12 FROM (SELECT DATE_FORMAT(a.regist_date - INTERVAL 15 DAY + INTERVAL 1 MONTH, '%m') mm FROM t a WHERE a.regist_date BETWEEN '20171216' AND '20181215' ) a ;