2.IT/DB,ORACLE

[ORACLE] 오라클 여러 행을 하나의 컬럼으로 만들기 (LISTAGG )

꿍스뿡이 2020. 7. 7. 17:31


 꿍스뿡이의 드림빌더 

[ORACLE] LISTAGG

안녕하세요. 꿍스뿡이입니다!

오늘은 ORACLE에서 자주 사용하는 LISTAGG 사용방법에 대해 다뤄보겠습니다.

 

1. ORACLE LISTAGG

LISTAGG는 동일한 열에 출력되어 있는 여러개의 행의 데이터를 1줄로 표현하고자 할때 LISTAGG함수를 사용하여

손쉽게 출력하도록 도와주는 함수입니다.

 

2. 연습용 데이터

 

WITH TEST_TABLE AS  (
SELECT '홍길동' AS USER_NAME, 2 AS ORDER_NUMBER FROM DUAL
UNION
SELECT '김길동' AS USER_NAME, 1 AS ORDER_NUMBER FROM DUAL
UNION
SELECT '이길동' AS USER_NAME, 3 AS ORDER_NUMBER FROM DUAL
)
SELECT USER_NAME,
       ORDER_NUMBER 
  FROM TEST_TABLE;

 

연습용 데이터 입니다. WITH문 하단의 SELECT문을 이용하여 연습하시면 됩니다.

위의 데이터의 테이블명은 TEST_TABLE이며,  USER_NAME이라는 컬럼과 ORDER_NUMBER라는 컬럼으로 구성되어 있습니다.

 

3. 문제

연습용 데이터가 주어진 후 다음과 같은 문제가 주어졌다고 가정해보겠습니다.

 

Q.) USER_NAME에 해당하는 3명의 이름을 ","구분자를 사용하여 1줄로 표현하세요. 단 표현의 순서는 ORDER_NUMBER에 적힌 숫자의 역순입니다.

A.) 결과값은 이길동, 홍길동, 김길동이어야 합니다.

 

 

4. 기본문법, 사용방법

 

SELECT LISTAGG(대상컬럼명, 구분자) WITHIN GROUP (ORDER BY 정렬기준컬럼) AS LIST_NAME
  FROM 테이블명;

문제를 풀기에 앞서 기본문법을 살펴보겠습니다.

LISTAGG는 위와같은 표현방식으로 구성이 되어 있는데요.

 

1줄로 표현하고자 하는 대상컬럼명을 LISTAGG 가장 앞쪽에 배치합니다. 그리고 뒤에 표현하고자 하는 구분자를 넣어줍니다.

1줄로 표현되는 순서는 대상컬럼명 -> 구분자 -> 대상컬럼명 순으로 진행되며 마지막에 구분자값은 생략됩니다.

즉, LISTAGG(USER_NAME, ',')으로 표현했을 경우 홍길동,김길동,이길동으로 포현되며 마지막 이길동 뒤에 ','표시는 생략됩니다.

 

정렬기준컬럼은 1줄로 표현되는 데이터의 표현순서를 정해주는것입니다. 별도의 정렬기준 컬럼이 명시되어 있다면, 해당 컬럼명을 ORDER BY 뒷쪽에 표현하면 됩니다.

본 문제에서는 ORDER_NUMBER 역순 기준으로 정렬순서를 명시했기에 ORDER BY ORDER_NUMBER DESC라는 형식으로 표현하면 됩니다.

 

 

5. 풀이

 

WITH TEST_TABLE AS  (
SELECT '홍길동' AS USER_NAME, 2 AS ORDER_NUMBER FROM DUAL
UNION
SELECT '김길동' AS USER_NAME, 1 AS ORDER_NUMBER FROM DUAL
UNION
SELECT '이길동' AS USER_NAME, 3 AS ORDER_NUMBER FROM DUAL
)
SELECT LISTAGG(USER_NAME, ',') WITHIN GROUP (ORDER BY ORDER_NUMBER DESC) AS LIST_NAME
  FROM TEST_TABLE

 

정상적으로 문제를 풀었다면 위와같은 결과값을 도출할 수 있습니다.

여기까지 오라클 LISTAGG의 기본적인 사용방법에 대해 다뤄봤습니다.

 

다음에는 조금 복잡한 조건에서 LISTAGG를 사용하는 방법에 대해 포스팅 하겠습니다.

 

내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요! 

내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!