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

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

섭코딩 2020. 8. 4. 21:38

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

 

반응형