시간별 통계수치 구하기 0 4 15,685

by 정진우 통계 시간별 24시간 [2014.01.17 15:14:54]


안녕하세요 ^_^

또 질문을 하나 올리게 되었네요.

강좌와 답변들로 많은 성장(?)을 이루고 있는 느낌을 받고 있는 정진우입니다.

지금 질문을 하고자하는 내용은 다음과같습니다. 
일단 코드는 아래와 같구요.

SELECT COUNT(TO_CHAR(ACTION_TIME, 'HH24')) AS PV_HOURS ,TO_CHAR(ACTION_TIME, 'HH24') AS DT_HOURS

FROM VISITOR_ACTIONS

WHERE TO_CHAR(ACTION_TIME,'YYYY/MM/DD') = '2014/01/17'

AND SITE = 1

GROUP BY TO_CHAR(ACTION_TIME, 'HH24');
1 번사이트에 해당일자에 일어난 이벤트 수의 합계를 구하고자 하는 것인데요.

위와같이 하면 데이터가 존재하는 시간대의 데이터만 나옵니다.

10시와 11시 13시에 데이터가 있다면

PV_HOURS  |  DT_HOURS
----------------------------------------
         1         |      10
         10       |      11
         50       |      13

이렇게요, 이렇게 나와도 데이터는 틀린것이 아닌것 같은데.

제가 구하고 싶은것은 하루치 총 24시간에 대한 값입니다.

때문에 데이터가 없더라 하더라도 ..


PV_HOURS  |  DT_HOURS
----------------------------------------
         0        |      0
         0         |      1
         0         |      2
         0         |      3
         0         |      4
         0         |      5
         0         |      6
         0         |      7
         0         |      8
         0         |      9
         10       |      10
         50       |      11
         0         |      12
         50       |      13
         0         |      14
         0         |      15
         0         |      16
         0         |      17
         0         |      18
         0         |      19
         0         |      20
         0         |      21
         1         |      22
         10       |      23
         10       |      24

이러한 식으로요. 어떻게 하면 구할 수 있는지 .. 좀 알 고 싶습니다.

COUNT 가 0이라도 제한없이 전부 구간을 정해서 데이터가 나오게 할 수는 없을까요 ?

by 용근님 [2014.01.17 15:26:20]
SELECT NVL ( pv_hours, 0 ) AS pv_hours 
     , dt_hours
  FROM (
        SELECT COUNT(*) AS pv_hours 
             , TO_CHAR ( a.action_time, 'HH24' ) AS dt_hours
          FROM visitor_actions a
         WHERE a.action_time BETWEEN TO_DATE ( '20140117', 'YYYYMMDD' )
                                 AND TO_DATE ( '20140117', 'YYYYMMDD' ) + 0.99999
           AND a.site = 1
         GROUP BY TO_CHAR ( a.action_time, 'HH24' );
) a
    , ( SELECT TO_CHAR ( LEVEL ) lv FROM DUAL CONNECT BY LEVEL <= 24 ) b
WHERE a.dt_hours (+) = b.lv

by 정진우 [2014.01.17 17:09:43]
용근님 감사합니다.


GROUP BY 절에 있는 ; 를 제외하고 하면 잘되네요.

궁금한 점이있습니다.

TO_DATE 함수 뒤에 +0.99999  가 붙어있는데

이게 있으면 데이터가 나오고 없으면 데이터 조회가 되질 않더라구요.

무슨 용도로 사용되는 것인가요 ??

by 용근님 [2014.01.17 17:11:46]
SELECT TO_DATE ( '20140117', 'YYYYMMDD' ) FROM DUAL SELECT TO_DATE ( '20140117', 'YYYYMMDD' ) + 0.99999 FROM DUAL

by 용근님 [2014.01.17 17:11:49]
SELECT TO_DATE ( '20140117', 'YYYYMMDD' ) FROM DUAL SELECT TO_DATE ( '20140117', 'YYYYMMDD' ) + 0.99999 FROM DUAL
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입