해당 년월에 근무한 일자(MM)를 횡으로 10개만 보여주고 싶어요 0 2 1,646

by DONKEY [2016.09.21 19:10:38]


근무.png (60,436Bytes)


 

안녕하세요. 퇴근들 하셨는지 모르겠네요..ㅎㅎㅎ 저는 일을 하고 있습니다!

질문하나 올리겠습니다..

사원별 스케쥴을 뽑으면 데이터가 종대로 나오게 되는데요 이를 아래 그림처럼 PIVOT된 형태로 보여주고싶습니다...

PIVOT으로 해보려고 시도를 해봤는데 기준이 되는 코드가 아니라 근무한 YMD의 일자만 짤라서 나열해야되고 근무 일자

관련 컬럼은 10개 고정입니다... 그리고 총 시간 컬럼은 근무일 * 8 (근무일 카운트) 입니다..

어떻게 해야할지 모르겠습니다..

도와주시면 정말 정말 감사하겠습니다..

근무 일정 스키마

근무부서 코드 DUT_DEPT_CD(PK)  사번  EMP_NO(PK)  근무일자(YYYYMMDD)  DUT_YMD(PK)

근무 구분코드  DUT_GB_CD 리마커 RMK  요일 DAY 순위RANKING
 

자격증 스키마
  사번           일련번호    자격면허코드       자격면혀번호
EMP_NO(PK)    SEQ(PK)    QULFLCNS_CD   QULFLCNS_NO

  

 

SELECT * FROM ( SELECT EMP_NO
     , (SELECT KOR_NM
          FROM MIJ_EMPLOYE
         WHERE EMP_NO = A.EMP_NO) AS KOR_NM
     , (SELECT QULFLCNS_NO
          FROM MIJ_LICENCE
         WHERE EMP_NO = A.EMP_NO
           AND QULFLCNS_CD = 'W03') AS QULFLCNS_NO 
     , SUBSTR(DUT_YMD,-2) AS DUT_MM
  FROM MID_DUTYSCHEDULE A
 WHERE DUT_GB_CD = '37' 
   AND DUT_DEPT_CD = '03171000' 
   AND DUT_YMD LIKE '200707' || '%')
 PIVOT (MAX(DUT_MM) FOR DUT_MM IN(01 AS "1",2 AS "2",3 AS "3",4 AS "4",5 AS "5",6 AS "6",7 AS "7",8 AS "8",9 AS "9",10 AS "10"))

--이런 식으로 할려고 했으나.. 얼토당토 않네요..

by jkson [2016.09.22 08:22:43]

WITH MID_DUTYSCHEDULE AS
(
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160901' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160902' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160903' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160905' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160910' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160913' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160917' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '1' EMP_NO, '20160931' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160903' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160904' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160907' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160909' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160910' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160911' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160913' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160916' DUT_YMD FROM DUAL UNION ALL
SELECT 'A' DUT_DEPT_CD, '2' EMP_NO, '20160921' DUT_YMD FROM DUAL
)
SELECT EMP_NO, DAY1, DAY2, DAY3, DAY4, DAY5, DAY6, DAY7, DAY8, DAY9, DAY10
     , (CNT*8)||'('||CNT||')' TOTH  FROM
(
SELECT EMP_NO,SUBSTR(DUT_YMD,-2) DUT_MM
     , ROW_NUMBER() OVER(PARTITION BY EMP_NO ORDER BY DUT_YMD) RN
     , COUNT(1) OVER(PARTITION BY EMP_NO) CNT
  FROM MID_DUTYSCHEDULE
 WHERE DUT_YMD LIKE '201609%'
   AND DUT_DEPT_CD = 'A'
)
PIVOT (MAX(DUT_MM) FOR RN IN (1 AS "DAY1",2 AS "DAY2",3 AS "DAY3",4 AS "DAY4",5 AS "DAY5"
                             ,6 AS "DAY6",7 AS "DAY7",8 AS "DAY8",9 AS "DAY9",10 AS "DAY10"))

참고하셔서 작성해보세요.


by DONKEY [2016.09.22 08:46:14]

와... 너무 감사드립니다 ㅜㅜ.. ROW_NUMBER로 만들어서 피봇을 할수도있군요,, 너무감사드립니다 또하나알아가네요

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