DB

[DB][Oracle] LISTAGG

오선지♬ 2025. 5. 15. 20:02
728x90
반응형

LISTAGG는 Oracle DB를 포함한 SQL 데이터베이스에서 여러 행의 값을 하나의 문자열로 집계(Aggregation) 할 때

사용하는 함수입니다.

주로 그룹화된 데이터를 문자열로 연결할 때 유용합니다.


📌 기본 문법

LISTAGG(column_name, 'delimiter') WITHIN GROUP (ORDER BY column_name)
 
  • column_name: 연결할 열 이름
  • 'delimiter': 각 값 사이에 넣을 구분자 (예: ',', ' | ', 등)
  • WITHIN GROUP (ORDER BY ...): 연결할 값들의 정렬 순서를 지정

📌 예시

예제 테이블: STUDENT_COURSE

STUDENT_ID COURSE_NAME
1001 Math
1001 Science
1001 History
 

▶ LISTAGG 사용

SELECT 
	STUDENT_ID
    , LISTAGG(COURSE_NAME, ', ') WITHIN GROUP (ORDER BY COURSE_NAME) AS COURSES FROM STUDENT_COURSE 
GROUP BY STUDENT_ID;

결과:


STUDENT_ID COURSES
1001 History, Math, Science
 

📌 특징

  • GROUP BY 와 함께 사용하여 그룹별 문자열 집계 가능
  • WITHIN GROUP (ORDER BY ...) 로 정렬 순서 지정 가능
  • Oracle 12c 이상에서는 LISTAGG(... ON OVERFLOW TRUNCATE) 를 사용하여 너무 긴 결과를 자를 수도 있음

📌 주의점

  • 오류 발생 가능: 연결된 결과 문자열이 4000 byte(CHAR 기준) 이상이면 Oracle에서는 오류 발생 (ORA-01489)
  • 중복 제거: 기본적으로 중복 제거는 안 됨 → DISTINCT 서브쿼리로 처리해야 함
 
SELECT LISTAGG(MTRM_NM, ', ') ... FROM ( SELECT DISTINCT MTRM_NM ... )
728x90
반응형

'DB' 카테고리의 다른 글

[DB][Oracle] ROWNUM / ROW_NUMBER()  (0) 2025.05.18
[DB] LISTAGG / STRING_AGG  (0) 2025.05.16
[DB] DBMS별 기본 NULL 정렬 방식  (0) 2025.04.13
[DB][Oracle] INSTR Null 처리  (0) 2025.04.12
[DB][Oracle] INSTR  (0) 2025.04.11