안녕하세요.
많은 도움과 참고를 하고 있습니다.
난관에 부딪혀 시간만 허비하다가 결국엔 이곳에 도움요청을 드립니다.
[경우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
;
마농님.. 정말 감사합니다.
답변 주셔서 잘 해결했습니다.
생각이 많이 한다고 했는데도 .. 이런 아이디어는 잘 안떠오르더라구요..
다시한번 감사드립니다.