https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030
업무 중 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 ▼
'개발공부 > SQL' 카테고리의 다른 글
[ORACLE] 특수문자 찾기/특수문자 치환하기/특수문자 정규식 (0) | 2023.03.31 |
---|---|
[ORACLE] 숫자 외의 데이터가 있는 필드 찾기(하이픈 포함 여부) (0) | 2023.02.14 |
[ORACLE] 값이 한글로 되어있는 데이터 찾기 (0) | 2023.02.14 |
[ORACLE] 함수(Function) 찾기 (0) | 2023.02.14 |
[ORACLE] DB에 저장된 HTML태그 제거 (0) | 2022.10.27 |
댓글