오라클에서 24시간 데이터 표시할 경우... 0 1 5,325

by 망뎅이 [SQL Query] [2012.12.05 17:41:48]


with v_time as (
    select 
        lpad(to_char(trunc(sysdate),'hh24') + LEVEL - 1, 2, '0') hour
    from dual
    connect by level <= 24
)
select
    hour
from v_time t1 left join t_test t2 (t1.hour = t2.hour)
where to_date(t2.enterdate, 'yyyymmdd') >= to_date('20120903', 'yyyymmdd') and to_date(t2.enterdate, 'yyyymmdd') <= to_date('20120905', 'yyyymmdd')

과 같이 쿼리를 생성했는데요....

t_test에 있는 컬럼은 hour라는 컬럼과 enterdate 컬럼이고, 제가 원하는 데이터는 00시 ~ 23시까지 데이터의 여부에 상관없이 모든 시간의 ROW를 출력하면서 데이터 존재여부를 비교하고 싶은데요, 위와 같이 쿼리를 짰을 경우, t_test 테이블에 있는 데이터만 출력이 됩니다.

HOUR         EXIST
00                 O
01                  X
02                  O
..                   ...
23                  O

와 같이 데이터가 나오도록 쿼리를 수정하고 싶습니다. 쿼리를 어떻게 수정해야 할까요 ㅠㅠ 고수님들, 도와주세요 ㅠㅠ


by 마농 [2012.12.05 18:10:43]
-- 불필요한 함수 사용이 너무 많네요. 거추장스러운 함수는 다 제거했습니다.
WITH v_time AS
(
SELECT LPAD(LEVEL - 1, 2, '0') hour
  FROM dual
 CONNECT BY LEVEL <= 24
)
SELECT t1.hour
     , DECODE(COUNT(t2.hour), 0, 'X', 'O') exist
  FROM v_time t1
  LEFT JOIN t_test t2
    ON t1.hour = t2.hour
   AND t2.enterdate >= '20120903'
   AND t2.enterdate <= '20120905'
 GROUP BY t1.hour
 ORDER BY t1.hour
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입