15분 단위를 30분단위로 변경 1 5 1,258

by dynamicduc [SQL Query] [2021.04.08 21:38:05]


이미 테이블엔 15분단위로 들어가져 있지만 select을 할떄는

30분 단위로 보여주며  그사이에 다른 컬럼들의 데이터를 SUM을 해야하는

상황이 되었는데요.. 어떤식으로 해야할지 떠오르지가 않습니다 ㅜㅜ

도움부탁드리겠습니다..

데이터 형식은 vchar(8) 입니다. ORACLE DB 입니다.

현재           

TIME        DATA
0900        1            
0915        1        
0930        3            
0945        0    
1000        2            
1015        1          
1030        3            
1045        0   
1100        1            
   

 

수정후
TIME        DATA    
0900        1    
0930        4
1000        2
1030        4
1100        1

 

SELECT
      TIME
      SUM (data1)
FROM TABLE1
      GROUP BY TIME

위가 기존 쿼리라고 보시면 됩니다 ㅜㅜ

 

by pajama [2021.04.09 00:20:38]

조잡한데..ㅠㅠ 깔끔한 방법이 안떠오르네요.

 

WITH T (TI, DAT) AS (
SELECT '0900', 1 FROM DUAL UNION ALL
SELECT '0915', 1 FROM DUAL UNION ALL
SELECT '0930', 3 FROM DUAL UNION ALL
SELECT '0945', 0 FROM DUAL UNION ALL
SELECT '1000', 2 FROM DUAL UNION ALL
SELECT '1015', 1 FROM DUAL UNION ALL
SELECT '1030', 3 FROM DUAL UNION ALL
SELECT '1045', 0 FROM DUAL UNION ALL
SELECT '1100', 1 FROM DUAL
)
SELECT TO_CHAR(TI, 'HH24MI') TI, SUM_DATA
FROM
(
SELECT TRUNC(TO_TIMESTAMP(TI,'HH24MI'),'HH') + ROUND(EXTRACT(MINUTE FROM TO_TIMESTAMP(TI,'HH24MI')) / 30) * INTERVAL '30' MINUTE TI, SUM(DAT) SUM_DATA
FROM T
GROUP BY TRUNC(TO_TIMESTAMP(TI,'HH24MI'),'HH') + ROUND(EXTRACT(MINUTE FROM TO_TIMESTAMP(TI,'HH24MI')) / 30) * INTERVAL '30' MINUTE
)
ORDER BY TI

 


by 마농 [2021.04.09 08:17:33]
WITH t AS
(
SELECT '0900' tm, 1 v FROM dual
UNION ALL SELECT '0915', 1 FROM dual
UNION ALL SELECT '0930', 3 FROM dual
UNION ALL SELECT '0945', 0 FROM dual
UNION ALL SELECT '1000', 2 FROM dual
UNION ALL SELECT '1015', 1 FROM dual
UNION ALL SELECT '1030', 3 FROM dual
UNION ALL SELECT '1045', 0 FROM dual
UNION ALL SELECT '1100', 1 FROM dual
)
SELECT TO_CHAR(TO_DATE(tm, 'hh24mi') + SUBSTR(tm, -1) * 3/24/60, 'hh24mi') tm
     , SUM(v) v
  FROM t
 GROUP BY TO_DATE(tm, 'hh24mi') + SUBSTR(tm, -1) * 3/24/60
 ORDER BY tm
;

 


by 동동동 [2021.04.09 08:29:50]

마농님 죄송하지만 * 3/24/60 의 의미를 알 수 있을까요??

24 = 24시간

60 = 60분

3 = ?

 

TO_DATE(tm, 'hh24mi') + SUBSTR(tm, -1) * 3/24/60

이렇게 하면 30분 단위로 값이 만들어 지는데... 왜 그렇게 되는건지 이해가 안되네요..ㅠㅠ

 


by 마농 [2021.04.09 08:44:52]

tm 의 마지막 자리는 0 아니면 5 두가지 뿐이죠.
거기에 3을 곱하면 0 또는 15가 됩니다.
날짜에 1 을 더하면 하루를 더한 날짜가 나오게 됩니다.
+ 1/24 는 1시간을 더하게 되고
+ 1/24/60 은 1분을 더하게 됩니다.
즉, 끝자리가 0일때는 0분을, 5일때는 15분을 더하게 됩니다.


by 동동동 [2021.04.09 08:54:59]

마농님 친절한 설명 감사드립니다...ㅠㅠ 꾸벅...

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입