listagg처럼 비슷하긴 한데,. 연속구간은 하나로 표현하기. 0 2 217

by sun [SQL Query] [2019.08.12 17:32:58]


안녕하세요. 

많은 도움과 참고를 하고 있습니다.

난관에 부딪혀 시간만 허비하다가 결국엔 이곳에 도움요청을 드립니다.

[경우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로 돌리면서 붙이기 해보니깐 경우에 따라서 결과값이 달라 통일시키기가 어렵네요. 

부탁 좀 드립니다. 

 

by 마농 [2019.08.12 18:42:55]
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
;

 


by sun [2019.08.13 09:14:07]

마농님.. 정말 감사합니다. 

답변 주셔서 잘 해결했습니다. 

생각이 많이 한다고 했는데도 .. 이런 아이디어는 잘 안떠오르더라구요.. 

다시한번 감사드립니다. 

 

 

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