본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] 여러 행을 한 행으로 합치기 (LISTAGG, WM_CONCAT 차이)

반응형

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

LISTAGG

LISTAGG Syntax Description of the illustration ''listagg.gif'' See Also: "Analytic Functions" for information on syntax, semantics, and restrictions of the ORDER BY clause and OVER clause Purpose For a specified measure, LISTAGG orders data within each gro

docs.oracle.com

 

반응형