본문 바로가기
데이터로 생각하기

[MSSQL] 한 그룹 내 여러 행 하나로 합치기 - STRING AGG

by 에네치 2023. 1. 24.

STRING AGG 함수를 사용해 여러 개 ROW를 쉼표로 구분된 하나의 값으로 만드는 방법을 소개하고자 합니다. 단, MSSQL 2017 이상 버전만 해당 함수를 활용가능합니다. STRING AGG가 안될 경우, MSSQL에서 처리하는 방법에 대해서는 아래 글에서 소개하였습니다.

[MSSQL] 한 그룹 내 여러 행을 하나의 값으로 합치기 - ROW_NUMBER, JOIN, CONCAT 활용하기


MS SQL에서 해당 함수를 소개한 문서를 보면, 특정 기사에 삽입된 태그들을 뉴스 제목과 함께 정렬한다든지, 한 그룹의 이메일 수신인을 한 번에 보낼 수 있게 묶어준다든지 실제 회사에서 운영 업무 시 활용해볼 수 있는 예시들이 많이 기재되어 있습니다. 그만큼 활용도가 높은 함수로 보입니다. 준비한 예시 데이터는 다음과 같습니다

City State_Name
Phoenix AZ
Tucson AZ
Mesa AZ
Denver CO
Colorado Springs CO
Aurora CO
Fort Collins CO

 

WITH #TABLE AS 
(
    SELECT 'Phoenix' City, 'AZ' State_Name UNION ALL
    SELECT 'Tucson' City, 'AZ' State_Name UNION ALL
    SELECT 'Mesa' City, 'AZ' State_Name UNION ALL
    SELECT 'Denver' City, 'CO' State_Name UNION ALL
    SELECT 'Colorado Springs' City, 'CO' State_Name UNION ALL 
    SELECT 'Aurora' City, 'CO' State_Name UNION ALL
    SELECT 'Fort Collins' City, 'CO' State_Name 
)

SELECT *
FROM #TABLE



STRING AGG 함수사용하기

STRING_AGG ( expression, separator ) WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

📌 하나의 컬럼에 합치기 (e.g. city 이름 전체를 하나의 컬럼에 나열한다)

SELECT STRING_AGG(CITY, ', ') Cities 
FROM #TABLE

 

Cities
Phoenix, Tucson, Mesa, Denver, Colorado Springs, Aurora, Fort Collins



📌 GROUP으로 묶기 ( e.g. State를 기준으로 도시 이름을 합친다)

-- 함수 안에 (1)합치고자 하는 컬럼(CITY)  (2) 구분할 수 있는 표현(,)를 넣어준다
SELECT STATE_NAME , STRING_AGG(CITY, ',') Cities 
FROM #TABLE
GROUP BY STATE_NAME

 

Cities State_Name
Phoenix, Tucson, Mesa AZ
Denver, Colorado Springs, Aurora, Fort Collins CO


📌 GROUP 내에서 특정 순서대로 정렬해서 묶는다 ( e.g. State 내에 도시 알파벳 순으로 이름을 합친다)

-- 함수 안에 (1)합치고자 하는 컬럼(CITY)  (2) 구분할 수 있는 표현(,)를 넣어준다
SELECT STATE_NAME, STRING_AGG(CITY, ',') WITHIN GROUP (ORDER BY CITY DESC) Cities 
FROM #TABLE
GROUP BY STATE_NAME

 

Cities State_Name
Tucson, Phoenix, Mesa AZ
Fort Collins, Denver, Colorado Springs, Aurora CO