2016-05-31 3 views
1

지난 1 년간의 데이터를 가져옵니다. 일부 날짜는 0 주문이 있었다 나는이 보여보다는이 같은 간단한 쿼리가 완전히오라클은 데이터가없는 날짜로 0을 표시합니다.

를 생략 할 : 오히려 내가 싶어

Date   Count 
01-JAN-2016 5 
03-JAN-2016 7 
05-JAN-2016 3 

을 돌아보다

SELECT DATE, COUNT(*) FROM ORDERS 
GROUP BY DATE 
ORDER BY DATE 

하지만를 :

Date   Count 
01-JAN-2016 5 
02-JAN-2016 0 
03-JAN-2016 7 
04-JAN-2016 0 
05-JAN-2016 3 

어떻게 Oracle에서이 작업을 수행 할 수 있습니까?

답변

3

관심있는 모든 날짜가 포함 된 다른 표가 필요합니다. 당신은 다음과 같은 것을 가지고 비행 중에 그러한 것을 만들 수 있습니다.

설정 :

SQL> CREATE TABLE test_date (date_col) AS 
    2  (SELECT TO_DATE('01012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    3  SELECT TO_DATE('02012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    4  SELECT TO_DATE('02012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    5  SELECT TO_DATE('04012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    6  SELECT TO_DATE('04012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    7  SELECT TO_DATE('06012016', 'ddmmyyyy') FROM DUAL UNION ALL 
    8  SELECT TO_DATE('06012016', 'ddmmyyyy') FROM DUAL 
    9  ); 

Table created. 

질문 :

SQL> SELECT date_col2, COUNT(date_col) 
    2  FROM ( SELECT TO_DATE('01012016', 'ddmmyyyy') + LEVEL -1 AS date_col2 
    3     FROM DUAL 
    4   CONNECT BY TO_DATE('01012016', 'ddmmyyyy') + LEVEL -1 <= TO_DATE('10012016', 'ddmmyyyy')) dates 
    5   LEFT OUTER JOIN test_date ON (date_col = date_col2) 
    6 GROUP BY date_col2 
    7 ORDER BY 1; 

DATE_COL2 COUNT(DATE_COL) 
--------- --------------- 
01-GEN-16    1 
02-GEN-16    2 
03-GEN-16    0 
04-GEN-16    2 
05-GEN-16    0 
06-GEN-16    2 
07-GEN-16    0 
08-GEN-16    0 
09-GEN-16    0 
10-GEN-16    0 

10 rows selected. 

이 가입, 2016년 1월 1일 및 2016년 10월 1일 사이의 날짜를 고려 외부에서 테이블을 사용합니다 ; 관심있는 간격에 맞게 편집 할 수 있습니다.

+0

1 월 1 일을 포함하려면 레벨 -1이 필요하다는 점을 제외하고는 정확합니다 (레벨은 1에서 시작하고 0이 아님). – mathguy

+0

@mathguy : 네 말이 맞아, 내 잘못이야. 감사 – Aleksej

1

오라클의 경우 파티셔스 외부 조인 (Partar Outer Join)을 사용하여 사소한 데이터를 채우기 위해 특별히 설계된 중요한 경우에 가장 효율적입니다.

여기 문서화 : https://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW00736

귀하의 예는 사소한 종류로 분류하지만, 다른 상황에서이 방법을 알고있을 수 있습니다.