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
;