찌니의 프로그래밍 삼매경

[SQL] Oracle LISTAGG 함수 본문

SQL/SQL공부

[SQL] Oracle LISTAGG 함수

zzI니☆ 2021. 5. 31. 15:09
728x90

LISTAGG 함수는 oracle 11g부터 지원하는 내장함수

리스트 형태의 데이터를 그루핑 할 때 사용한다

실제 프로젝트에서 몇번 써본적이 있는데 유용해서 정리해본다


기본구조

SELECT LISTAGG(대상컬럼, 구분자) WITHI GROUP (ORDER BY 정렬기준컬럼) FROM TABLE명
;

1. LISTAGG 사용법

 

오라클에서 제공하는 EMP 테이블 조회

SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP;


30번 부서에 속한 사원들을 확인

SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP
WHERE DEPTNO = 30;


각 부서별 사원명을 출력해보자. GROUP BY 사용시작

SELECT DEPTNO, ENAME 
FROM EMP
GROUP BY DEPTNO, ENAME
ORDER BY DEPTNO
;


LISTAGG 함수 이용하기

각 부서별로 속해있는 사원을 한 행으로 출력

SELECT 
	DEPTNO,
	LISTAGG(ENAME , ' , ') WITHIN GROUP(ORDER BY ENAME DESC) AS ENAMES
FROM EMP
GROUP BY DEPTNO
;

LISTAGG 함수를 이용하면 원하는 형태로 그루핑이 가능하다

 


 

2. LISTAGG함수 실행 결과에서 중복 제거 ⭐⭐⭐⭐⭐⭐⭐

 

 

직책별 부서출력

SELECT 
	JOB
	,DEPTNO
	,ENAME
FROM EMP
ORDER BY JOB, DEPTNO;


동일한 직책을 LISTAGG를 통해 그루핑해보자

SELECT 
	JOB,
	LISTAGG(DEPTNO, ' , ')
	WITHIN GROUP ( ORDER BY DEPTNO ASC) AS DEPTS
FROM EMP
GROUP BY JOB
;


보기좋지만 그루핑된 JOB에 같은 DEPTS가 중복되어 출력된다. FROM절에 중복제거된 상태의 서브쿼리를 사용해본다

SELECT 
	JOB,
	LISTAGG(DEPTNO, ' , ')
	WITHIN GROUP ( ORDER BY DEPTNO) AS DEPTS
FROM (
         SELECT JOB, DEPTNO
         FROM EMP
         GROUP BY JOB, DEPTNO
     ) A
GROUP BY JOB
;

 

 

꼭 기억해두자

728x90

'SQL > SQL공부' 카테고리의 다른 글

[SQL] Oracle TO_CHAR  (0) 2021.06.10
[SQL] Oracle WITH절(임시테이블)  (0) 2021.06.09
[SQL] Drop, Truncate, Delete 차이점  (0) 2021.06.08
[SQL] Oracle 날짜함수 (계속 추가중)  (0) 2021.06.07
[SQL] Oracle 정규식(Regular Expression)  (1) 2021.06.06
Comments