SELECT b.DAY_CHAR, b.DAY_NUM, TO_CHAR( NVL( c.RE_VISIT_PER, 0), '990.00' ) AS RE_VISIT_PER_30, TO_CHAR( NVL( a.RE_VISIT_PER, 0), '990.00' ) AS RE_VISIT_PER, TO_CHAR( NVL( a.RE_VISIT_PER, 0) - NVL( c.RE_VISIT_PER, 0), '990.00' ) AS UPDOWN FROM ( SELECT NVL( TO_CHAR(visit_time, 'YYYY/MM/DD'), 'TOTAL') AS VISIT_TIME, COUNT(*) AS ALL_VISITOR, SUM(visit_return) AS RE_VISIT_CNT, SUM(visit_return)/COUNT(*) AS RE_VISIT_PER FROM ci_visitor_info WHERE TO_DATE(TO_CHAR(visit_time, 'YYYY/MM/DD'),'YYYY/MM/DD') BETWEEN TO_DATE ( '2014/01/19' , 'YYYY/MM/DD' ) AND TO_DATE ( '2014/01/25' , 'YYYY/MM/DD' ) AND id_site = 1 GROUP BY ROLLUP((TO_CHAR(visit_time, 'YYYY/MM/DD'))) ) a, ( SELECT LEVEL lv, TO_CHAR(TO_DATE ( '2014/01/19' , 'YYYY/MM/DD' )-1 + LEVEL , 'YYYY/MM/DD') AS DAY_NUM, TO_CHAR(TO_DATE ( '2014/01/19' , 'YYYY/MM/DD' )-1 + LEVEL , 'DY') AS DAY_CHAR FROM dual CONNECT BY (TO_DATE ( '2014/01/25' , 'YYYY/MM/DD' )-TO_DATE ( '2014/01/19' , 'YYYY/MM/DD' ))+1 >= LEVEL ) b, ( SELECT TO_CHAR( visit_time, 'DY') AS VISIT_DAY, COUNT(*) AS ALL_VISITOR, SUM(visit_return) AS RE_VISIT_CNT, SUM(visit_return)/30 AS RE_VISIT_PER FROM ci_visitor_info WHERE TO_DATE(TO_CHAR(visit_time, 'YYYY/MM/DD'),'YYYY/MM/DD') BETWEEN TO_DATE ( '2014/01/19' , 'YYYY/MM/DD' )-(30-7) AND TO_DATE ( '2014/01/25' , 'YYYY/MM/DD' ) AND id_site = 1 GROUP BY TO_CHAR( visit_time, 'DY') ) c WHERE a.VISIT_TIME (+)= b.DAY_NUM AND c.VISIT_DAY (+) = b.DAY_CHAR ORDER BY b.lv
1. 날짜 조건을 주실 때 컬럼을 to_char 하고 다시 또 to_date 하네요.
이는 너무나도 소모적인 일이며 안해도 될 일이죠.
컬럼은 그대로 두고 조건값만 변경시켜 조건을 주세요.
WHERE visit_time >= TO_DATE ('2014/01/19', 'yyyy/mm/dd')
AND visit_time < TO_DATE ('2014/01/25', 'yyyy/mm/dd') + 1
2. 일주일치 재방문비율과 30일치 재방문율 구하는 공식이 다르네요?
SUM(visit_return)/COUNT(*) AS re_visit_per
SUM(visit_return)/30 AS re_visit_per
일관성이 있어야 하는 것 아닌가요?
재방문율 구하는 공식 자체도 왜 이렇게 구하는건지 의문이네요?
3. 결국은 요일별 통계를 구하는 듯 한데?
최근 30일을 구하면? 주 7일로 나누면 28이 나누어 떨어지고 2일이 남게 되는데?
금,토는 5주간 통계, 나머지 일~목은 4주간 통계가 되어버립니다.
이 또한 통계 자료로서 일관성이 떨어지게 되는거죠.
재방문율에 대한 정확한 정의와
통계기간에 대한 조정(7의 배수, 4주 또는 5주)이 필요하지 않을런지요?
SELECT a.day_char , a.day_num , TO_CHAR(NVL(b.r28, 0), '990.00') re_visit_per_28 , TO_CHAR(NVL(b.r07, 0), '990.00') re_visit_per , TO_CHAR(NVL(b.r07, 0) - NVL(b.r28, 0), '990.00') updown FROM (SELECT LEVEL lv , DECODE(LEVEL, 8, '합계', TO_CHAR(sdt + LEVEL - 1, 'dy')) day_char , DECODE(LEVEL, 8, '', TO_CHAR(sdt + LEVEL - 1, 'yyyy/mm/dd')) day_num FROM (SELECT TO_DATE('2014/01/19', 'yyyy/mm/dd') sdt FROM dual) CONNECT BY LEVEL <= 8 ) a , (SELECT NVL(TO_CHAR(visit_time, 'dy'), '합계') AS day_char , AVG(visit_return) AS r28 , AVG(CASE WHEN visit_time >= sdt THEN visit_return END) AS r07 FROM ci_visitor_info , (SELECT TO_DATE('2014/01/19', 'yyyy/mm/dd') sdt FROM dual) WHERE visit_time >= sdt - 21 AND visit_time < sdt + 7 AND id_site = 1 GROUP BY ROLLUP(TO_CHAR(visit_time, 'dy')) ) b WHERE a.day_char = b.day_char(+) ORDER BY a.lv ;