Develop

[PostgreSQL] 여러행을 한줄로 조회 Row to Column

issuemaker99 2024. 10. 21. 21:45
728x90

PostgreSQL에서 여러 행의 값을 특정 구분자를 넣어 한 줄로 출력하는 방법은 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 여러 열 값을 하나의 문자열로 결합하거나, 특정 그룹에 대한 데이터를 한 줄로 표현할 때 사용됩니다. 이를 가능하게 하는 대표적인 함수가 STRING_AGG() 함수입니다.

이번 글에서는 PostgreSQL에서 행 데이터를 구분자를 이용해 한 줄로 표현하는 방법에 대해 알아보겠습니다.


1. STRING_AGG() 함수란?

STRING_AGG() 함수는 PostgreSQL에서 문자열 집합을 구분자로 연결하여 하나의 문자열로 결합해주는 집계 함수입니다. 이 함수는 주로 여러 행을 하나의 문자열로 변환할 때 사용됩니다. 특정 컬럼의 값을 원하는 구분자(쉼표, 공백 등)를 넣어서 한 줄로 표현할 수 있습니다.


2. 기본 사용법

STRING_AGG()의 기본 구문은 다음과 같습니다:

STRING_AGG(column_name, 'delimiter')

 

  • column_name: 결합할 컬럼 값
  • 'delimiter': 각 값을 구분할 구분자 (쉼표, 공백 등)

이 함수는 지정한 컬럼의 값을 구분자로 연결하여 하나의 문자열로 반환합니다.


3. 예제: 단순한 사용

예를 들어, 다음과 같은 students 테이블이 있다고 가정해 봅시다.

students 테이블

id name major
1 Alice Mathematics
2 Bob Physics
3 Charlie Chemistry
4 David Biology

 

각 학생의 전공을 쉼표(,)로 구분해서 한 줄로 표현하고 싶다면, 다음과 같은 쿼리를 사용할 수 있습니다.

예제 쿼리

SELECT STRING_AGG(major, ', ') AS majors
FROM students;

 

결과:

majors
-------------------------------
Mathematics, Physics, Chemistry, Biology

 

설명

  • STRING_AGG(major, ', '): major 컬럼의 값을 쉼표와 공백(, )으로 구분하여 하나의 문자열로 결합합니다.
  • 결과는 한 줄로 결합된 전공 리스트입니다.

4. 예제: 그룹화된 데이터에 적용

특정 그룹에 속한 데이터를 한 줄로 결합할 때도 STRING_AGG()를 사용할 수 있습니다. 예를 들어, 각 전공별로 학생들의 이름을 한 줄로 결합하려면 GROUP BY와 함께 사용할 수 있습니다.

예제 쿼리

SELECT major, STRING_AGG(name, ', ') AS students_list
FROM students
GROUP BY major;

 

결과:

major students_list
Biology David
Chemistry Charlie
Mathematics Alice
Physics Bob

설명

  • GROUP BY major: 각 전공별로 학생을 그룹화합니다.
  • STRING_AGG(name, ', '): 각 전공에 속한 학생들의 이름을 쉼표와 공백으로 결합해 한 줄로 출력합니다.

이렇게 하면, 동일한 전공을 가진 학생들의 이름이 한 줄로 표현됩니다.


5. 예제: 중복 제거와 정렬

STRING_AGG()는 결합할 때 중복된 값도 함께 결합하지만, DISTINCT 키워드를 사용하면 중복을 제거할 수 있습니다. 또한, 결합할 값의 순서를 지정하고 싶다면 ORDER BY를 사용할 수 있습니다.

예제 쿼리: 중복 제거 및 정렬

SELECT STRING_AGG(DISTINCT name, ', ' ORDER BY name) AS sorted_names
FROM students;

 

결과:

sorted_names
------------------------------
Alice, Bob, Charlie, David

 

설명

  • DISTINCT: 중복된 이름이 있을 경우 중복을 제거하고 결합합니다.
  • ORDER BY name: 결합하기 전에 이름을 알파벳순으로 정렬합니다.

이와 같이, STRING_AGG()는 결합할 값을 정렬한 후 구분자를 사용하여 출력할 수 있습니다.


6. 예제: 여러 컬럼 결합하기

여러 컬럼을 구분자로 결합할 수도 있습니다. 예를 들어, 학생의 이름과 전공을 결합해 한 줄로 표현하려면 다음과 같은 쿼리를 사용할 수 있습니다.

예제 쿼리

SELECT STRING_AGG(name || ' (' || major || ')', ', ') AS student_info
FROM students;

 

결과:

student_info
----------------------------------------
Alice (Mathematics), Bob (Physics), Charlie (Chemistry), David (Biology)

 

설명

  • name || ' (' || major || ')': name과 major 컬럼을 괄호 안에 넣어서 결합합니다.
  • STRING_AGG(): 결합한 문자열을 쉼표와 공백으로 구분하여 한 줄로 출력합니다.

7. 주의 사항 

1. NULL 값 처리: STRING_AGG()는 기본적으로 NULL 값을 무시하고 결합합니다. 만약 NULL 값을 포함해 처리하고 싶다면 COALESCE()와 같은 함수를 사용할 수 있습니다.

SELECT STRING_AGG(COALESCE(major, 'Unknown'), ', ') AS majors
FROM students;

 

 

2. 데이터 양이 많을 경우: 결합할 데이터가 매우 많을 경우 성능에 영향을 미칠 수 있습니다. 이 경우, 결합할 데이터 양을 제한하거나 LIMIT 등을 사용하여 제어할 수 있습니다.


 

PostgreSQL의 STRING_AGG() 함수는 여러 행의 값을 구분자로 결합해 하나의 문자열로 출력할 수 있는 강력한 집계 함수입니다. 이를 통해 원하는 형식으로 데이터를 쉽게 가공할 수 있으며, 그룹별로 데이터를 한 줄로 표현할 수 있는 유용한 기능을 제공합니다.

 

LIST