반응형
ORACLE LISTAGG 여러 행을 하나의 컬럼으로 가져오기
11g 에서 추가. 10g 이하는 WM_CONCAT 함수 사용
(WM_CONCAT은 페이지 하단 Link 참고)
오라클에서 여러개의 열로 된 값을 한 행의 값으로 가져와야 할 때 LISTAGG 함수를 사용한다.
- 사용방법
SELECT LISTAGG(가져올컬럼, 구분자) WITHIN GROUP (ORDER BY 순서컬럼)
FROM TABLE_NM
아래의 예를 보자
예)
SELECT DRIVER_NM
FROM DRIVER_INFO;
DRIVER_INFO 테이블에서 DRIVER_NM 컬럼을 가져왔다.
위와 같은 여러 열의 값을 LISTAGG를 사용하여 하나의 열로 가져와 보자.
SELECT LISTAGG(DRIVER_NM, ',') WITHIN GROUP (ORDER BY DRIVER_NM) AS DRIVER_NM
FROM DRIVER_INFO
DRIVER_NM 컬럼의 값을 오름차순 그룹으로 묶어 하나의 열로 표현 했다.
그렇다면 LISTAGG의 중복을 제외하기 위해선 어떻게 해야 할까?
아쉽게도 LISTAGG는 중복제외(DISTINCT)를 지원하지 않는다.
SELECT DISTINCT(LISTAGG(DRIVER_NM, ',') WITHIN GROUP (ORDER BY DRIVER_NM)) AS DRIVER_NM
FROM DRIVER_INFO
위와 같이 DISTINCT를 사용하여도 오류는 나지 않지만
기존에 사용하지 않은 쿼리와 같은 값을 조회한다.
그래서 이를 해결하기 위해
아래와 같이 서브쿼리를 사용하여 중복을 제외한 테이블에서 LISTAGG를 사용한다.
SELECT LISTAGG(DRIVER_NM, ',') WITHIN GROUP (ORDER BY DRIVER_NM) AS DRIVER_NM
FROM (SELECT DISTINCT DRIVER_NM FROM DRIVER_INFO)
참조)
다른 컬럼과 같이 GROUPING 된 LISTAGG 를 조회 하려면 PARTITION BY를 사용한다.
SELECT DRIVER_ID
, LISTAGG(DRIVER_NM, ',') WITHIN GROUP (ORDER BY DRIVER_NM)
OVER(PARTITION BY DRIVER_ID) AS DRIVER_NM
FROM DRIVER_INFO
이것 말고도 WM_CONCAT을 활용한 방법도 존재합니다.
아래의 Link를 참고하세요.
Link : 오라클 WM_CONCAT 하나의 컬럼으로 가져오기, 중복제거
반응형
'Database > SQL' 카테고리의 다른 글
Oracle 오라클 KEEP()함수 사용법 그룹함수로 조회한 행 중에 다른 컬럼 가져오는 방법 (0) | 2015.12.22 |
---|---|
오라클 Oracle 가장큰값, 두번째 큰값, 가장작은값, 두번째로 작은값 구하기 GREATEST, LEAST (0) | 2015.11.25 |
ORACLE MERGE 조건에 따라 INSERT, UPDATE (0) | 2015.08.19 |
오라클 두 테이블의 컬럼에서 같은 값 확인 ORACLE DECODE 활용 (0) | 2015.08.05 |
MySQL 문자열 합치기, 문자열 결합 CONCAT (0) | 2014.06.24 |
댓글