그룹핑질문! 0 2 472

by 띵똥 [2018.11.19 15:46:05]


아래 데이터가 휴가 유형별 일자로 그룹핑되어 아래와 같이 표현하려면 어떻게 해야 하나요?!

SELECT CASE WHEN MIN(일자) = MAX(일자) THEN MAX(일자)
            ELSE MIN(일자) ||'~'|| MAX(일자)
        END AS WORK_DE,
       오전,
       오후
  FROM 휴가테이블
 GROUP BY 오전,오후;
 
이렇게되면 근무 유형별로 날짜가 나올수 없어서요..

일자          오전        오후
20181108                일반연차
20181109    일반연차    일반연차
20181112    대체휴무    대체휴무
20181113    일반연차    일반연차
20181114    일반연차    일반연차
20181115    일반연차   

 =>
 
20181108                일반연차
20181109    일반연차    일반연차
20181112    대체휴무    대체휴무
20181113
~20181114   일반연차    일반연차
20181115    일반연차

by 마농 [2018.11.19 16:44:51]
WITH t AS
(
SELECT '20181108' dt, '' am, '일반연차' pm FROM dual
UNION ALL SELECT '20181109', '일반연차', '일반연차' FROM dual
UNION ALL SELECT '20181112', '대체휴무', '대체휴무' FROM dual
UNION ALL SELECT '20181113', '일반연차', '일반연차' FROM dual
UNION ALL SELECT '20181114', '일반연차', '일반연차' FROM dual
UNION ALL SELECT '20181115', '일반연차', ''         FROM dual
)
SELECT MIN(dt) || DECODE(COUNT(*), 1, '', '~'||MAX(dt)) dt
     , am
     , pm
  FROM (SELECT dt, am, pm
             , TO_DATE(dt, 'yyyymmdd')
             - ROW_NUMBER() OVER(PARTITION BY am, pm ORDER BY dt) gb
          FROM t
        )
 GROUP BY am, pm, gb
 ORDER BY dt
;

 


by 띵똥 [2018.11.21 09:42:49]

감사합니다!!

TO_DATE(dt, 'yyyymmdd') - ROW_NUMBER() OVER(PARTITION BY am, pm ORDER BY dt 이런식으로 응용할수 있었네요..오늘도 배우고 갑니다..

_(__)_

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