2010-08-11 2 views
1

Oracle 시스템에 사용자가 수행 한 작업이 포함 된 테이블이 Oracle 데이터베이스에 있습니다. 통계 분석에 사용되며 특정 날짜에 대해 수행 된 작업 수를 시간별로 그룹화하여 표시해야합니다.레코드가없는 시간을 포함하여 시간별로 그룹화 된 레코드를 선택하는 방법

그래도 괜찮은 쿼리가 있지만 아무런 작업도 포함하지 않은 시간을 표시하지 않습니다 (분명히 그 시간 동안 표시 할 레코드가 없기 때문입니다). 예를 들어

쿼리 :

SELECT TO_CHAR(event_date, 'HH24') AS during_hour, 
    COUNT(*) 
FROM user_activity 
WHERE event_date BETWEEN to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS') 
    AND to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS') 
AND event = 'user.login' 
GROUP BY TO_CHAR(event_date, 'HH24') 
ORDER BY during_hour; 

이 (홀수 시작과 끝 날짜에 더주의를 기울이 없다, 그들은 GMT에있어 때문에이처럼 나는 GMT + 10 해요 -하지만 그건입니다 별도의 문제가이 질문에)

이것은의 결과 세트를 생산하고 답변 할 수있는 능력에 영향을 미치는 않는 :

DURING_HOUR   COUNT(*)    
---------------------- ---------------------- 
00      12      
01      30      
02      18      
03      20      
04      12      
05      24      
06      20      
07      4      
23      8      

9 rows selected 

가 어떻게 0 이벤트가 포함 하루의 시간을 표시하려면이 쿼리를 ammend 수 있습니까?

Stack Overflow를 검색하여 비슷한 질문을했지만 내 특정 문제에 대한 답변이 없습니다.

귀하의 협조에 감사드립니다.

답변

6
SELECT h.hrs, NVL(Quantity, 0) Quantity 
FROM (SELECT TRIM(to_char(LEVEL - 1, '00')) hrs 
     FROM dual 
     CONNECT BY LEVEL < 25) h 
LEFT JOIN (SELECT TO_CHAR(event_date, 'HH24') AS during_hour, 
        COUNT(*) Quantity 
      FROM user_activity u 
      WHERE event_date BETWEEN 
       to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS') AND 
       to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS') 
      AND event = 'user.login' 
      GROUP BY TO_CHAR(event_date, 'HH24')) t 
ON (h.hrs = t.during_hour) 
ORDER BY h.hrs; 
3

하나의 옵션은 24 행으로 별도의 테이블을 생성하는 것입니다 : 00 - 그럼 외부> (23)

는 반대 가입 할 수 있습니다.

관련 문제