여러 컬럼들을 정렬하여 조합하려고 합니다. 1 7 1,460

by 쭈니아빠 [SQL Query] 정렬 조합정렬 여러컬럼정렬 [2015.09.04 14:03:54]


안녕하세요. 정렬과 관련하여 해결이 힘들어서 글을 올립니다.

만일 데이터가 현재 아래와 같이 존재할 경우

순번 컬럼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개만 들어올 경우도 있습니다.

여러 고수분들의 도움 부탁드립니다.

감사합니다.

by jkson [2015.09.04 14:36:34]
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

 


by 쭈니아빠 [2015.09.04 14:52:28]

와~! 이렇게 빨리 해결이 되네요.

jkson님의 도움 너무 감사드립니다.

 


by 마농 [2015.09.04 15:22:20]
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
;

 


by jkson [2015.09.04 15:42:43]

마농님 wm_concat은 sorting 기능은 없는 거로 아는데 어떻게 sorting이 되는 건가용?


by 마농 [2015.09.04 15:57:23]

Distinct 요.


by jkson [2015.09.04 16:12:24]

오~ 몰랐던 사실이네요 distinct 하니까 정말 정렬되는 군요~!


by 쭈니아빠 [2015.09.04 18:03:01]

정말 여기 오라클 클럽에서 많이 배우고 있습니다.

감사합니다~! ^_______^

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