본문 바로가기
개발공부/SQL

[ORACLE] LISTAGG를 활용하여 하나의 행으로 합치기

by 양히◡̈ 2022. 9. 14.

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

업무 중 LISTAGG를 사용해야할 일이 있었다.
한 사람당 반드시 하나의 row만 나오도록 처리해야되는 일이었다.
기존 쿼리를 어떻게 바꿔야할지 막막했는데 선배에게 LISTAGG를 사용해보라는 조언을 듣고 처음 사용해보게 되었다.

LISTAGG는 집계 함수로, WHERE 조건에 해당하는 컬럼값을 하나의 필드에 담아 조회하게 해준다.

아래 문법을 SELECT절에 추가해서 사용한다.

LISTAGG(합칠 컬럼명, 구분자) WITHIN GROUP(ORDER BY 정렬 컬럼명

 

하지만 나의 경우, 모든 컬럼을 하나의 필드로 만드는 것이 아니라, 어떤 컬럼은 합치고, 어떤 컬럼은 합치면 안됐다.
이럴 때는 GROUP BY 절도 함께 사용해서 합쳐지면 안 되는 컬럼을 명시해주면 된다.

 

SELECT 그룹할 컬럼명,
LISTAGG(합칠 컬럼명구분자) WITHIN GROUP(ORDER BY 정렬 컬럼명)  AS 컬럼명
FROM 조회할 테이블명
WHERE 조회할 조건
GROUP BY 그룹할 컬럼명

 


 

예시를 들어 보자.

아래와 같이 emp 테이블을 조회하는 쿼리가 있다.

 

 

 

 

여기서 직급으로 그룹을 묶어 해당 직급인 사원의 이름을 조회하고자 한다면,

SELECT job, LISTAGG (ename, ',') WITHIN GROUP (ORDER BY ename) AS names
  FROM emp
GROUP BY job;

이런 식으로 GROUP BY를 이용하는 것이다.

 

 

 

조회시 이러한 결과를 얻을 수 있다.

 

 


Reference ▼

 

[Oracle] 오라클 LISTAGG 함수 사용법 (중복제거, 정렬, 컬럼 합치기)

오라클에서 여러 행의 컬럼 값을 하나로 합치기 위해서는 XMLAGG(오라클 9i 이하), WM_CONCAT(오라클 10g~11g R1) 함수를 사용하였다. 오라클 11g R2 버전부터 WM_CONCAT 함수를 사용을 할 수 없으며 LISTAGG 함

gent.tistory.com

 

댓글