일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바스크립트
- 자바 스트림
- 구글로그인
- 스프링
- kotlin 클래스
- mysql
- pygame
- 스프링시큐리티
- 파이게임
- Leetcode
- 스프링부트 채팅서버
- javascript
- SQL프로그래머스
- 프로그래머스
- LeetCode SQL
- oauth2
- 스프링부트
- SQL
- python
- MSA
- oracle
- 오라클
- java8
- 자바8
- SQL 문제풀이
- js
- Spring
- 코틀린 클래스
- springboot
- spring boot
Archives
- Today
- Total
웅겹살의 프로그래밍 삼매경
[SQL] Oracle LISTAGG 함수 본문
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