oracle > mysql 쿼리 질문드릴께요. 0 1 189

by 일회용 [MySQL] [2018.03.12 09:51:24]


 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로 바꾸려는데 함수들을 뭘써야할까요.

by 마농 [2018.03.12 10:21:46]

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
;

 

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