SQL/SQL공부
[SQL] Oracle LISTAGG 함수
웅겹사r☆
2021. 5. 31. 15:09
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
;
꼭 기억해두자