삭제 0 2 1,650

by Oracle10g [SQL Query] [2017.09.21 11:46:13]


운영 데이터라 문제의 소지가 생겨 삭제하겠습니다.

도움주신분들 감사합니다!!

by 마농 [2017.09.21 17:38:30]

샘플데이터는 열씸히 만들어 주셨으나?
해당 원본 대비 결과표가 상관관계가 보이질 않네요.
원본 따로 결과 따로, 설명도 부실하고 따로 따로.
원본 대비 결과가 서로 맞아야, 설명이 좀 부족하더라도 추측이 가능한데요.
결과자료를 빈칸을 임으로 채우는 방식이 아닌
원본자료로부터 완벽한 인과관계를 가지고 결과자료를 만들어 주셔야 합니다.
만들어 주신 쿼리도 돌아가질 않네요.
샘플 데이터 량을 좀 줄이고 완변한 인과관계의 결과를 만들어 주세요.


by 마농 [2017.09.22 09:06:09]
WITH tmp AS
(
SELECT SUBSTR(a.trainymd, 1, 6) ym
     , a.empno
     , SUBSTR(a.trainymd, 7, 2)+0 dd
     , a.week                                    v0 -- 주차
     , MIN(DECODE(a.traingb, '03', a.traindept)) v1 -- 배치부서
     , MIN(DECODE(a.traingb, '03', a.traingbcd)) v2 -- 근무형태
     , MIN(DECODE(a.traingb, '05', a.traindept)) v3 -- 당직위치
     , MIN(DECODE(a.traingb, '05', a.traingbcd)) v4 -- 당직형태
     , MIN(DECODE(a.traingb, '03', b.duttm))||'' v5 -- 연속수련
     , GREATEST(NVL(ROUND(
       ( TO_DATE(a.trainymd||MIN(DECODE(a.traingb, '03', b.strtime)), 'yyyymmddhh24mi')
       - LAG(
         TO_DATE(MIN(DECODE(a.traingb, '03',
         CASE WHEN b.endtime = '2400'     THEN TO_CHAR(TO_DATE(a.trainymd, 'yyyymmdd') + 1, 'yyyymmdd')||'0000'
              WHEN b.endtime <= b.strtime THEN TO_CHAR(TO_DATE(a.trainymd, 'yyyymmdd') + 1, 'yyyymmdd')||b.endtime
              ELSE a.trainymd||b.endtime
          END
         ) ), 'yyyymmddhh24mi')
         ) OVER(PARTITION BY a.empno ORDER BY a.trainymd)
       ) * 24, 2), 0), 0)||'' v6 -- 휴식시간
     , SUM(MIN(DECODE(a.traingb, '03', b.duttm))) OVER(PARTITION BY a.empno, a.week ORDER BY a.trainymd)||'' v7 -- 누적시간
     , COUNT(MIN(DECODE(a.traingb, '05', 1)))     OVER(PARTITION BY a.empno, a.week ORDER BY a.trainymd)||'' v8 -- 누적당직
     , MIN(DECODE(c.clngb, '', '0', '1')) v9 -- 주당휴일
  FROM er_resitrainestdd a
     , er_resiweektime   b
     , er_calendar       c
 WHERE a.ocpgrdcd  = :v_ocpgrdcd
   AND a.trainymd >= TO_CHAR(   TRUNC(TO_DATE(:v_ym, 'yyyymm'), 'iw'), 'yyyymmdd')
   AND a.trainymd <= TO_CHAR(LAST_DAY(TO_DATE(:v_ym, 'yyyymm'))      , 'yyyymmdd')
   AND b.trainym = SUBSTR(a.trainymd, 1, 6)
   AND b.traindept = a.traindept
   AND b.traingbcd = a.traingbcd
   AND a.trainymd  = c.ymd
 GROUP BY a.empno, a.trainymd, a.week
)
SELECT *
  FROM (SELECT *
          FROM tmp
         WHERE ym = :v_ym
        )
 UNPIVOT (v FOR gb IN (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9))
 PIVOT (MIN(v) FOR dd IN (  1,  2,  3,  4,  5,  6,  7,  8,  9, 10
                         , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
                         , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
                         , 31 ))
;

 

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