날짜 범위에 있는 건수 구하는 법.. 0 6 2,289

by 물개 [SQL Query] [2013.08.23 16:27:54]


현재 저장된 테이블에
불특정 날짜마다 에러가 저장되어있습니다.

날짜, 건수
20130820, 3
20130823, 5
... 이하 생략

이런형태로 저장되어있는데
이 건수에 관한 내용으로 
날짜에 관해 선그래프로 표현하려고 하여 질문드립니다.

제가 원하는 결과값은

조건이 아래와 같을 경우
where 날짜 between '20130701' and '20130831'

결과값
날짜, 건수
20130701, 0
20130702, 0
20130703, 0
...(중략)
20130820, 3
20130821, 0
20130822, 0
20130823, 5
...(중략)
20130831, 0

이렇게 결과가 나오길 원합니다.

현재 건수가 있는 경우만
날짜에 한해 count로 건수 값을 얻고 있는데요

건수가 저장되어있지 않는 
날짜 범위에 대해서 0건이라는 결과값도 같이 얻길 원합니다.

읽어주셔서 감사합니다.

0건 인 것을 조회하여 아우터 조인하면 될 것 같다고 합니다만;
쿼리쪽은 너무 무지하네요 ㅠ...

---이하 건수 얻는 쿼리입니다---
SELECT   SUBSTR (에러발생일시, 1, 8) 날짜, COUNT (SUBSTR (에러발생일시, 1, 8)) 건수
    FROM   테이블명
   WHERE   SUBSTR (에러발생일시, 1, 8) BETWEEN '20130701' AND '20130831'
GROUP BY   SUBSTR (에러발생일시, 1, 8)
ORDER BY   SUBSTR (에러발생일시, 1, 8) DESC 
by 우리집아찌 [2013.08.23 16:40:38]
 
WITH T ( dt , cnt ) AS (
SELECT '20130820' , 3 FROM DUAL UNION ALL
SELECT '20130823' , 5 FROM DUAL 
)

-- 조건 20130701 - '20130831'
SELECT t2.dt , NVL(t1.cnt,0) 
FROM T t1,
   (SELECT TO_DATE('20130701','YYYYMMDD') + LEVEL - 1 AS DT FROM DUAL 
    CONNECT BY LEVEL <= TO_DATE('20130831','YYYYMMDD') - TO_DATE('20130701','YYYYMMDD')+ 1 ) t2
WHERE t2.dt = t1.dt(+)
ORDER BY t2.dt


by 물개 [2013.08.23 16:58:55]
답변 감사합니다!
순식간에 해결 되었습니다 ㅠㅠ

by 아린 [2013.08.23 16:49:32]
WITH err_tab(dt) AS(
SELECT '20130820102340' FROM dual UNION ALL
SELECT '20130820102342' FROM dual UNION ALL
SELECT '20130820102344' FROM dual UNION ALL
SELECT '20130823110201' FROM dual UNION ALL
SELECT '20130823110301' FROM dual UNION ALL
SELECT '20130823110401' FROM dual UNION ALL
SELECT '20130823110501' FROM dual UNION ALL
SELECT '20130823110601' FROM dual
)
SELECT dt, MAX(cnt) cnt
  FROM (SELECT SUBSTR(dt,1, 8) dt, COUNT(*) cnt
          FROM err_tab
         WHERE dt BETWEEN :p_sdt||'000000' 
                      AND :p_edt||'235959'
         GROUP BY SUBSTR(dt,1, 8)
         UNION ALL     
        SELECT TO_CHAR(TO_DATE(:p_sdt, 'yyyymmdd') 
             + LEVEL - 1, 'yyyymmdd') dt
             , 0 cnt
          FROM dual
         CONNECT BY LEVEL <= TO_DATE(:p_edt,'yyyymmdd')
                           - TO_DATE(:p_sdt,'yyyymmdd') 
                           + 1
        )              
 GROUP BY dt
 ORDER BY dt DESC 

by 물개 [2013.08.23 16:59:48]
답변 감사합니다!!!

by 마농 [2013.08.23 16:51:05]
-- 사용하신 쿼리에 비효율이 좀 있네요.
-- 1. 조회 조건 줄 때. 컬럼을 가공하지 말고 조건값을 가공하여 비교하세요.
-- 2. 건수 구할때 COUNT(값)을 하지 말고 그냥 COUNT(*) 하세요.
SELECT a.날짜
     , NVL(b.건수, 0) 건수
  FROM (SELECT TO_CHAR(TO_DATE('20130701', 'yyyymmdd') + LEVEL - 1, 'yyyymmdd') 날짜
          FROM dual
         CONNECT BY LEVEL <= TO_DATE('20130831', 'yyyymmdd')
                           - TO_DATE('20130701', 'yyyymmdd')
                           + 1
        ) a
     , (SELECT SUBSTR(에러발생일시, 1, 8) 날짜
             , COUNT(*) 건수
          FROM 테이블명
         WHERE 에러발생일시 >= '20130701'
           AND 에러발생일시 <= '20130831'||'235959'
         GROUP BY SUBSTR(에러발생일시, 1, 8)
        ) b
 WHERE a.날짜 = b.날짜(+)
 ORDER BY 건수
;

by 물개 [2013.08.23 17:00:13]
답변 감사합니다 ㅠ 주석의 의미도 잘 생각해 보겠습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입