안녕하세요.
많은 도움과 참고를 하고 있습니다.
난관에 부딪혀 시간만 허비하다가 결국엔 이곳에 도움요청을 드립니다.
[경우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로 돌리면서 붙이기 해보니깐 경우에 따라서 결과값이 달라 통일시키기가 어렵네요.
부탁 좀 드립니다.
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 | 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 ; |