리스트 형태로 보여주려고 합니다 0 1 1,478

by 보일듯말듯 [2015.12.22 17:06:56]


재직년한 귀속기간 휴직/결근 기간 출근율 근속년한(년간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 을 사용하여 리스트로 뿌려줄 수 밖에 없는 건가요?

아니면 다른 좋은 방법이 있는지요..

 

by 아발란체 [2015.12.23 09:32:10]
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 

 

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