안녕하세요.
많은 도움과 참고를 하고 있습니다.
난관에 부딪혀 시간만 허비하다가 결국엔 이곳에 도움요청을 드립니다.
[경우1]
time | cd |
10 | 교육 |
11 | 연수 |
12 | 연수 |
13 | 연수 |
14 | 교육 |
15 | 교육 |
16 | 반차 |
17 | |
18 | |
19 |
위의 결과값을 컬럼 하나에 넣으려고 하는데요..
[경우1] 나와야 할 결과값 : 10 : 교육, 11~13:연수, 14~15:교육, 16:반차
[경우 2]
time | cd |
09 | 연수 |
10 | 연수 |
11 | 교육 |
12 | 연수 |
13 | |
14 | 연수 |
15 | |
16 | |
17 | |
18 |
|
[경우2]나와야 할 결과값: 09~10:연수, 11:교육,12연수,14:연수
두가지 경우 모두 cd 컬럼 null인것은 붙이기에서 제외.
각각 위와 같은 경우가 있는데요.쿼리로 나와야할 결과값을 구할 수 있을까요?
cursor로 돌리면서 붙이기 해보니깐 경우에 따라서 결과값이 달라 통일시키기가 어렵네요.
부탁 좀 드립니다.
WITH t AS ( SELECT '01' id, '10' tm, '교육' cd FROM dual UNION ALL SELECT '01', '11', '연수' FROM dual UNION ALL SELECT '01', '12', '연수' FROM dual UNION ALL SELECT '01', '13', '연수' FROM dual UNION ALL SELECT '01', '14', '교육' FROM dual UNION ALL SELECT '01', '15', '교육' FROM dual UNION ALL SELECT '01', '16', '반차' FROM dual UNION ALL SELECT '02', '09', '연수' FROM dual UNION ALL SELECT '02', '10', '연수' FROM dual UNION ALL SELECT '02', '11', '교육' FROM dual UNION ALL SELECT '02', '12', '연수' FROM dual UNION ALL SELECT '02', '14', '연수' FROM dual ) SELECT id , LISTAGG(stm||etm||':'||cd, ',') WITHIN GROUP(ORDER BY stm) x FROM (SELECT id , MIN(tm) stm , DECODE(COUNT(*), 1, '', '~'||MAX(tm)) etm , cd FROM (SELECT id, tm, cd , tm - ROW_NUMBER() OVER(PARTITION BY id, cd ORDER BY tm) gb FROM t WHERE cd IS NOT NULL ) GROUP BY id, gb, cd ) GROUP BY id ORDER BY id ;