결론부터 보자면

xmlagg(xmlelement(a,',' || val) order by val).extract('//text()')

OR 

xmlagg(xmlelement(a,',' || val) order by val).extract('//text()').getStringVal()

자세한 설명은 아래에..


GBNVAL
A001
A002
A003
A004
A005
A011
B007
B004
B005
B010
C011
C001
C002
C

03


이런 내용이 있을때 gbn으로 그룹핑을 하고 val의 내용을 하나의 컬럼으로 받고 싶다고 해보자

GBNVAL
A001,002,003,004,005,011
B004,005,007,010
C001,002,003,011


이때 쓸 수 있는 방법이 xmlagg와 xmlelement 함수다

xmlelement는 주어진 태그로 값을 감싸 하나의 xml 엘리먼트를 만들어 주고


xmlagg는 xml 문서를 만들어주는 함수이다.


select  gbn,
          xmlelement(a,val) val
  from test

의 결과는

GBNVAL
A<A>001</A>
A<A>002</A>
A<A>003</A>
A<A>004</A>
A<A>005</A>
A<A>011</A>
B<A>007</A>
B<A>004</A>
B<A>005</A>
B<A>010</A>
C<A>011</A>
C<A>001</A>
C<A>002</A>
C<A>003</A>


이렇게 나오게 된다. 
xmlelement(a,val) --> 첫번째 항은 태그명이 되며 두번째 항은 태그내의 값이 된다.
                                첫번째 항을 소문자로 적어도 대문자로 태그가 만들어진다
                                따로 문자열 표시를 하지 않기 때문에 예약어의 경우 에러가 난다.
                                그때는 "로 감싸주면 된다.

이것을 

select  gbn,
           xmlagg(xmlelement(a,val)) val
  from test
group by gbn

이렇게 xmlagg로 한번 감싸 준다. xmlagg는 그룹함수로 해당 내용을 xml 문서로 만들어 준다
결과는 

GBNVAL
A<A>001</A><A>002</A><A>003</A><A>005</A><A>011</A><A>004</A>
B<A>007</A><A>004</A><A>010</A><A>005</A>
C<A>011</A><A>003</A><A>001</A><A>002</A>

요렇게 된다.

여기서 xml함수를 하나 더써서 태그 빼고 값만 가져온다
더불어 xmlagg 내의 내용을 val 로 order by  해준다

select  gbn,
          xmlagg(xmlelement(a,val) order by val).extract('//text()') val
  from test
group by gbn  

GBNVAL
A001002003004005011
B004005007010
C001002003011


val 값을 서로 구분하기 위해 값을 가져올때 미리 ','를 붙여 보자

select  gbn,
           xmlagg(xmlelement(a,',' || val) order by val).extract('//text()') val
  from test
group by gbn

GBNVAL
A,001,002,003,004,005,011
B,004,005,007,010
C,001,002,003,011


마지막으로 맨 앞의 콤마 하나를 제거해준다

select  gbn,
          substr(xmlagg(xmlelement(a,',' || val) order by val).extract('//text()'), 2) val
  from test
group by gbn  

GBNVAL
A001,002,003,004,005,011
B004,005,007,010
C001,002,003,011


완성~~~ ^^


pxmlagg나 xmlelement를 사용하여 나온 결과는 xml형을 가지게 됩니다. 이걸 substr을 쓰면 문자열형식으로 바뀌는데, substr을 사용하지 않고 문자열 형식으로 받고 싶을 때는
xmlagg(xmlelement(a,',' || val) order by val).extract('//text()')
뒤에 가볍게
.getStringVal()
요거 하나 붙여주세요~
xmlagg(xmlelement(a,',' || val) order by val).extract('//text()').getStringVal()

출처: https://amnesis.tistory.com/4 [달바라기]


+ Recent posts