② 로우를 컬럼으로 변환하기
5장 그룹 함수 부분에서 설명하지 않은 집계 함수 중에 LISTAGG란 함수가 있다. 이는 11g 버전부터 새로 등장한 함수로 구문은 다음과 같다.
LISTAGG(expr, delimiter) WITHIN GROUP(ORDER BY 절)
이 함수는 expr을 delimiter로 구분해서, 로우를 컬럼으로 변환해 조회하는 함수다. 예제를 살펴 보자.
입력
CREATE TABLE ex7_2 AS
SELECT department_id,
LISTAGG(emp_name, ',') WITHIN GROUP (ORDER BY emp_name) as empnames
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
결과
table EX7_2이(가) 생성되었습니다.
입력
SELECT *
FROM ex7_2;
결과
DEPARTMENT_ID EMPNAMES
------------- -----------------------------------------
10 Jennifer Whalen
20 Michael Hartstein,Pat Fay
90 Lex De Haan,NeenaKochhar,Steven King
...
11개의 행이 선택됨.
쿼리 결과를 보면 부서번호별로 해당 사원이름(expr)이 ‘콤마(,)’(delimiter)로 구분되어 조회되었다. 사원 테이블에는 사원 개인별로 부서번호가 들어있는데 LISTAGG 함수를 사용해 부서별 사원 개개인을 한 줄로 쭉 늘어뜨린 형태로, 즉 로우를 컬럼 형태로 만든 것이다. 만약 SELECT 리스트의 department_id와 “GROUP BY department_id” 부분을 없애면 ‘,’를 구분자로 해서 전체 사원 이름이 한 컬럼으로 조회된다. 이전에는 위와 같은 형태로 결과를 뽑기 위해서는 쿼리를 복잡하게 작성해야 했지만, 이제는 이 함수 덕분에 로우를 컬럼으로 쉽게 변환할 수 있다.