1. LISTAGG 함수의 활용
오라클 쿼리를 실행하다보면 같은 조건을 가진 여러 행을 하나의 행으로 합치고 싶은 경우가 발생한다.
예를 들어 그림과 같은 테이블 데이터가 있다고 했을 때,
하나의 COUNTRY_ID (국가)에 있는 도시 종류를 한 눈에 보고싶다고 가정하자.
같은 COUNTRY_ID를 GROUP BY 처리하고,
그 GROUP에 해당하는 모든 행(ROW)을 한 행(ROW)으로 합쳐야한다.
이 때, 유용하게 쓸 수 있는 함수가 LISTAGG이다.
SELECT COUNTRY_ID, LISTAGG(CITY,',') WITHIN GROUP (ORDER BY CITY) AS 도시목록 FROM HR.LOCATIONS GROUP BY COUNTRY_ID ORDER BY COUNTRY_ID;
이 쿼리를 실행하면 아래와 같은 결과가 나온다.
COUNTRY_ID로 GROUP BY를 하여,
여러 행이던 CITY 컬럼의 데이터를 한 ROW로 LISTAGG(LIST AGGREGATION) 해주는 것이다.
LISTAGG의 두번째 PARAMETER는 구분자로 위 쿼리에서는 ,을 사용했는데 다른 구분자로 활용 가능하다.
2. WM_CONCAT과의 차이점
11g 이전 버전에서는 WM_CONCAT이라는 함수를 사용했다.
SELECT COUNTRY_ID, WM_CONCAT(CITY) AS 도시목록 FROM HR.LOCATIONS GROUP BY COUNTRY_ID ORDER BY COUNTRY_ID;
10g 버전의 오라클이라면 위 쿼리도 앞선 LISTAGG와 유사하게 사용 가능하다.
다만, WM_CONCAT은 합친 ROW의 정렬이 안 된다는 단점이 있다.
LISTAGG는 사용시 WITHIN GROUP (ORDER BY {컬럼명}) 을 통해 정렬이 가능하지만,
WM_CONCAT은 정렬이 불가능하다.
11g 이후에는 공식적으로 지원하지 않으니 LISTAGG의 활용을 추천.
참고자료 : https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030
'데이터 사이언스 DataScience > Data Base 데이터베이스' 카테고리의 다른 글
[Oracle] ORA-30036 UNDO 테이블스페이스 관리 (0) | 2020.09.10 |
---|---|
[Oracle] 테이블 단편화 정보 확인 (리오그 대상 식별법) (0) | 2020.08.21 |
[Oracle] LONG 타입 데이터 TO_LOB 통해 CTAS, ITAS 하기 (0) | 2020.08.11 |
[Oracle] 시퀀스의 옵션에 담긴 의미 (0) | 2020.07.14 |
[Oracle 11g~] 온라인 테이블 redefinition (reorg) (0) | 2020.07.13 |