안녕하세요. 정렬과 관련하여 해결이 힘들어서 글을 올립니다.
만일 데이터가 현재 아래와 같이 존재할 경우
순번 | 컬럼1 | 컬럼2 | 컬럼3 |
1 | B | A | C |
2 | D | A | |
3 | C | B | A |
4 | C | B | B |
5 | A | E | D |
위의 컬럼 값들에 대해 아래와 같이 정렬을 하여 조합을 하고자 합니다.
순번 | 컬럼정렬조합 |
1 | A,B,C |
2 | A,D |
3 | A,B,C |
4 | B,B,C |
5 | A,D,E |
또한 아래처럼 순번 4번처럼 B가 중복일 경우 아래처럼 GROUP BY 형태로 나오는 방법도 필요합니다.
순번 | 컬럼정렬조합 |
1 | A,B,C |
2 | A,D |
3 | A,B,C |
4 | B,C |
5 | A,D,E |
조합은 LISTAGG나 WM_CONCAT함수를 이용하면 되겠는데, 정렬이 힘드네요.
참고로 컬럼은 위처럼 제한되어 있으나 실제 데이터는 순번 2번처럼 2개만 들어올 경우도 있습니다.
여러 고수분들의 도움 부탁드립니다.
감사합니다.
with t as ( select 'B' col1, 'A' col2, 'C' col3 from dual union all select 'D' col1, 'A' col2, '' col3 from dual union all select 'C' col1, 'B' col2, 'A' col3 from dual union all select 'C' col1, 'B' col2, 'B' col3 from dual union all select 'A' col1, 'E' col2, 'D' col3 from dual ) select rn, listagg(col,',') within group(order by col) col from ( select rn , decode(lv,1,col1,2,col2,3,col3) col , row_number() over (partition by rn, decode(lv,1,col1,2,col2,3,col3) order by decode(lv,1,col1,2,col2,3,col3)) rnk from ( select rownum rn, col1, col2, col3 from t ) a, (select level lv from dual connect by level <= 3) b ) where rnk = 1--중복제거 group by rn
--아래는 unpivot 연습해봤습니다. with t as ( select 'B' col1, 'A' col2, 'C' col3 from dual union all select 'D' col1, 'A' col2, '' col3 from dual union all select 'C' col1, 'B' col2, 'A' col3 from dual union all select 'C' col1, 'B' col2, 'B' col3 from dual union all select 'A' col1, 'E' col2, 'D' col3 from dual ) select rn, listagg(col,',') within group(order by col) col from ( select rn, seq, col , row_number() over (partition by rn, col order by col) rnk from ( select rownum rn, col1, col2, col3 from t ) unpivot (col for seq in (col1 as 1, col2 as 2, col3 as 3)) ) where rnk = 1--중복제거 group by rn
WITH t AS ( SELECT 1 seq, 'B' c1, 'A' c2, 'C' c3 FROM dual UNION ALL SELECT 2, 'D', 'A', '' FROM dual UNION ALL SELECT 3, 'C', 'B', 'A' FROM dual UNION ALL SELECT 4, 'C', 'B', 'B' FROM dual UNION ALL SELECT 5, 'A', 'E', 'D' FROM dual ) SELECT seq , wm_concat(DISTINCT c) c FROM t UNPIVOT (c FOR gb IN (c1, c2, c3)) GROUP BY seq ORDER BY seq ;