초과근무 관련 통계 query 를 작성 중에 있습니다.
한참 버벅거리다가 고수님들 도움 받고자 글씁니다.
아래와 같은 테이블이 있습니다.
user_id |
work_hour |
0101 |
4 |
0101 |
2.01 |
0101 |
1.59 |
0102 |
3.11 |
0102 |
4.2 |
0102 |
4.13 |
0103 |
2.48 |
0103 |
3.37 |
0104 |
1.03 |
0104 |
2.37 |
- user_id : 사용자 ID
- work_hour : 근무시간. 소숫점 앞자리 시간, 소숫점 뒷자리 분
( 예: 4.2 = 4시간 20분, 1.03 = 1시간 3분 )
이걸 각 사용자 별로 통계를 추출해야 합니다.
소숫점 뒷자리는 mm(분)이니깐 합이 60일 때 1시간으로 더해야 합니다.
나름 버벅거리면서 작성한 쿼리가.
with emp as
(
select '0101' user_id, '4' work_hour from dual union all
select '0101' user_id, '2.01' work_hour from dual union all
select '0101' user_id, '1.59' work_hour from dual union all
select '0102' user_id, '3.11' work_hour from dual union all
select '0102' user_id, '4.2' work_hour from dual union all
select '0102' user_id, '4.13' work_hour from dual union all
select '0103' user_id, '2.48' work_hour from dual union all
select '0103' user_id, '3.37' work_hour from dual union all
select '0104' user_id, '1.03' work_hour from dual union all
select '0104' user_id, '2.37' work_hour from dual
)
select user_id
, work_hour
, TO_NUMBER(DECODE(INSTR(work_hour,'.') /* 시간에 '.' 있는지 확인 */
,0,work_hour
,SUBSTR(work_hour,0,INSTR(work_hour,'.')-1))) as hh
, TO_NUMBER(DECODE(INSTR(work_hour,'.') /* 시간에 '.' 있는지 확인 */
,0,'00'
,rpad(SUBSTR(work_hour,INSTR(work_hour,'.')+1),2,'0'))) as mm
from emp
/
이 것으로 work_hour 를 시간과 분으로 분리 하였습니다.
이 것을 아래와 같이 계산해야 합니다.
1. 위 결과물에서 hh (시간)은 sum하여 xx시간 으로 출력
2. mm(분)을 모두 sum하여 xx시간 xx분 으로 출력
3. 최종적으로 위 1과 2를 합하여 xx시간 xx분으로 출력
고수님들의 도움 부탁드립니다.