개요
MSSQL STRING_AGG 는 여러 행의 데이터를 한 컬럼으로 합치는 기능이고, 그 외에 CONCAT 으로 A + B + C 이런식으로 합치는 방법이 있는데, 여기서는 STRING_AGG 을 다룹니다. STRING_AGG 는 MSSQL 2017 버전에서 새로 생긴 기능이라서 그 이전 버전은 STUFF … FOR XML PATH… 구문을 이용해야 합니다.
CONCAT 은 MSSQL Concat 함수 참조
구문
STRING_AGG ( expression, separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
MSSQL STRING_AGG 기본 예제
예제 데이터

-- 정렬 없음
SELECT CLS_NM, STRING_AGG(NM_KR,'-')
FROM SAMPLE1
GROUP BY CLS_NM
-- 이름순 정렬
SELECT CLS_NM, STRING_AGG(NM_KR,'-') WITHIN GROUP ( ORDER BY NM_KR )
FROM SAMPLE1
GROUP BY CLS_NM

DISTINCT 포함 ( 서브쿼리에서 DISTINCT )
DISTINCT 가 필요할 경우, STRING_AGG 만을 이용해서는 별다른 해결책이 없음. 서브쿼리에서 DISTINCT 를 한 번 하고, 바깥에서 STRING_AGG 를 적용하는 방법이 현재까지 찾은 최선임
SELECT CLS_NM, STRING_AGG(NM_KR,'-')
FROM (
SELECT DISTINCT CLS_NM, NM_KR
FROM SAMPLE1
) A
GROUP BY CLS_NM