재직년한 | 귀속기간 | 휴직/결근 기간 | 출근율 | 근속년한(년간8할이상 출근한 경우에만 근속년수에 반영) | 연차휴가일수 | 연차사용기간 | |||||||
시작일 | 종료일 | 시작일 | 종료일 | 휴직월수(8할미만 출근월포함) | 미출근일 | 출근율 | 근속년수 | 가감 | 연차 | 가감 | 시작일 | 종료일 | |
1 | 2000-04-17 | 2001-04-17 | 1 | 1 | 0 | ||||||||
2 | 2001-04-17 | 2002-04-17 | 2 | 1 | 15 | 2000-04-17 | 2002-04-16 | ||||||
3 | 2002-04-17 | 2003-04-17 | 3 | 1 | 16 | 2002-04-17 | 2003-04-16 | ||||||
4 | 2003-04-17 | 2004-04-17 | 4 | 1 | 16 | 2003-04-17 | 2004-04-16 | ||||||
5 | 2004-04-17 | 2005-04-17 | 5 | 1 | 17 | 2004-04-17 | 2005-04-16 | ||||||
6 | 2005-04-17 | 2006-04-17 | 6 | 1 | 17 | 2005-04-17 | 2006-04-16 | ||||||
7 | 2006-04-17 | 2007-04-17 | 7 | 1 | 18 | 2006-04-17 | 2007-04-16 | ||||||
8 | 2007-04-17 | 2008-04-17 | 8 | 1 | 18 | 2007-04-17 | 2008-04-16 | ||||||
9 | 2008-04-17 | 2009-04-17 | 9 | 1 | 19 | 2008-04-17 | 2009-04-16 | ||||||
10 | 2009-04-17 | 2010-04-17 | 10 | 1 | 19 | 2009-04-17 | 2010-04-16 | ||||||
11 | 2010-04-17 | 2011-04-17 | 11 | 1 | 20 | 2010-04-17 | 2011-04-16 | ||||||
12 | 2011-04-17 | 2012-04-17 | 12 | 1 | 20 | 2011-04-17 | 2012-04-16 | ||||||
13 | 2012-04-17 | 2013-04-17 | 13 | 1 | 21 | 2012-04-17 | 2013-04-16 | ||||||
14 | 2013-04-17 | 2014-04-17 | 14 | 1 | 21 | 2013-04-17 | 2014-04-16 | ||||||
15 | 2014-04-17 | 2015-04-17 | 2015-01-01 | 2015-04-17 | 3 | 107 | 70 | 15 | 0 | 22 | 2014-04-17 | 2015-04-16 | |
16 | 2015-04-17 | 2016-04-17 | 2015-04-17 | 2015-12-31 | 8 | 259 | 29 | 15 | 0 | 17 | -5 | 2015-04-17 | 2016-04-16 |
17 | 2016-04-17 | 2017-04-17 | 15 | 1 | 11 | -11 | 2016-04-17 | 2017-04-16 | |||||
18 | 2017-04-17 | 2018-04-17 | 16 | 1 | 22 | 2017-04-17 | 2018-04-16 | ||||||
19 | 2018-04-17 | 2019-04-17 | 17 | 1 | 23 | 2018-04-17 | 2019-04-16 |
이런 결과물을 얻기 위해서 우선 쿼리는 아래처럼 작성해 보고 있습니다.
SELECT a.user_nm, a.ENTER_DT AS st_dt, TO_CHAR(ADD_MONTHS(a.ENTER_DT, 12), 'YYYYMMDD') AS end_dt, COUNT(a.enter_dt) FROM USERS a, SCH_PRV b WHERE a.user_id = b.USER_ID AND a.user_id = '000096' AND b.SCH_CHK = '3' AND b.REG_DT BETWEEN a.ENTER_DT AND ADD_MONTHS(a.ENTER_DT, 12) GROUP BY a.user_nm, a.ENTER_DT, ADD_MONTHS(a.ENTER_DT, 12) UNION ALL SELECT a.user_nm, TO_CHAR(ADD_MONTHS(a.ENTER_DT, 12), 'YYYYMMDD') AS st_dt, TO_CHAR(ADD_MONTHS(a.ENTER_DT, 24), 'YYYYMMDD') AS end_dt, COUNT(a.enter_dt) FROM USERS a, SCH_PRV b WHERE a.user_id = b.USER_ID AND a.user_id = '000096' AND b.SCH_CHK = '3' AND b.REG_DT BETWEEN ADD_MONTHS(a.ENTER_DT, 12) AND ADD_MONTHS(a.ENTER_DT, 24) GROUP BY a.user_nm, ADD_MONTHS(a.ENTER_DT, 12), ADD_MONTHS(a.ENTER_DT, 24)
쿼리의 결과는 아래와 같습니다.
USER_NM | ST_DT | END_DT | COUNT(A.ENTER_DT) |
보일듯 | 20080513 | 20090513 | 6 |
보일듯 | 20090513 | 20100513 | 17 |
입사일(enter_dt) 을 기준으로 1년씩 계산하여 union all 을 사용하여 리스트로 뿌려줄 수 밖에 없는 건가요?
아니면 다른 좋은 방법이 있는지요..
WITH T1(user_id, reg_dt, enter_dt) AS ( SELECT 'hong', '2014-07-01', '2014-05-05' FROM DUAL UNION ALL SELECT 'hong', '2015-07-05', '2014-01-01' FROM DUAL UNION ALL SELECT 'hong', '2012-07-20', '2012-02-05' FROM DUAL UNION ALL SELECT 'hong', '2016-02-04', '2015-03-03' FROM DUAL ) SELECT user_id, enter_dt AS st_dt, CASE WHEN(reg_dt >= enter_dt AND reg_dt <= ADD_MONTHS(enter_dt, 12)) THEN ADD_MONTHS(enter_dt, 12) ELSE ADD_MONTHS(enter_dt, 24) END AS end_dt, COUNT(enter_dt) FROM T1 WHERE user_id = 'hong' AND reg_dt BETWEEN enter_dt AND ADD_MONTHS(enter_dt, 24) GROUP BY user_id, enter_dt, CASE WHEN(reg_dt >= enter_dt AND reg_dt <= ADD_MONTHS(enter_dt, 12)) THEN ADD_MONTHS(enter_dt, 12) ELSE ADD_MONTHS(enter_dt, 24) END