DB/MSSQL
[MSSQL] 컬럼 문자열 합치기 (STRING_AGG(), STUFF())
alien22c
2024. 2. 27. 10:22
728x90
728x90
여러 행의 컬럼 값을 하나의 문자열로 합칠 때 사용.
2017 이상 부터 지원되는 STRING_AGG()를 사용하는 것이 제일 간편하며,
아래 샘플 쿼리로 사용법에 대해 바로 확인 가능하다.
1) STRING_AGG()
+ SQL Server 2017 이상의 버전에서 지원
+ GROUP BY 절과 함께 사용 가능 & ORDER BY 절을 사용하여 정렬이 가능하며 ORDER BY 절은 생략할 수 있음.
+ 형식) STRING_AGG("합칠 대상 컬럼명", "구분자") [WITHIN GROUP(ORDER BY "정렬하고자하는 컬럼명")]
-- ---------------------------------------- -- #1. [LastName] 문자열 합치기 -- ---------------------------------------- -- 1-1. 기본 조회 (특정 컬럼 문자열 합치기) SELECT STRING_AGG ([LastName], ',') AS [LastName_All] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) ; -- 1-2. id기준으로 Grouping하여 조회 : GROUP BY 추가 SELECT [id] , STRING_AGG ([LastName],', ') AS [LastName_All_GroupBy] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) GROUP BY [id] ; -- --------------------------------------------------- -- #2. [LastName] 컬럼으로 정렬하여 조회 -- --------------------------------------------------- -- 2-1. 기본 조회 (특정 컬럼 문자열 합치기) SELECT STRING_AGG([LastName],', ') WITHIN GROUP (ORDER BY [LastName]) AS [LastName_All_Ordering] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id], [LastName]) ; -- 2-2. id기준으로 Grouping하여 조회 : GROUP BY 추가 SELECT [id] , STRING_AGG([LastName],', ') WITHIN GROUP (ORDER BY [LastName]) AS [LastName_All_GroupBy&Ordering] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id], [LastName]) GROUP BY [id] ; |
2) STUFF() 함수와 FOR XML PATH 사용
+ 조회 시, 중복 제거를 위해 GROUP BY 또는 DISTINCT 사용 필요
+ 형식) STUFF(문자열, 시작위치, 문자길이, 치환문자)
-- ---------------------------------------- -- #1. [LastName] 문자열 합치기 -- ---------------------------------------- -- 1-1. 기본 조회 (특정 컬럼 문자열 합치기) SELECT DISTINCT STUFF( ( SELECT ','+ CONVERT(NVARCHAR,[LastName]) FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) FOR XML PATH('') ) , 1, 1, '') AS [LastName] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS A ([id],[LastName]) ; -- 1-2. id기준으로 Grouping하여 조회 : DISTINCT 또는 GROUP BY 추가 SELECT DISTINCT A.[id] , STUFF( ( SELECT ','+ CONVERT(NVARCHAR,[LastName]) FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) WHERE [id] = A.[id] FOR XML PATH('') ) , 1, 1, '') AS [LastName] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS A ([id],[LastName]) -- GROUP BY A.[id] ; -- ----------------------------------------------------- -- #2. [LastName] 컬럼으로 정렬하여 조회 -- ----------------------------------------------------- -- 2-1. 기본 조회 (특정 컬럼 문자열 합치기) SELECT DISTINCT STUFF( ( SELECT ','+ CONVERT(NVARCHAR,[LastName]) FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) ORDER BY [LastName] FOR XML PATH('') ) , 1, 1, '') AS [LastName] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS A ([id],[LastName]) ; -- 2-2. id기준으로 Grouping하여 조회 : DISTINCT 또는 GROUP BY 추가 SELECT DISTINCT A.[id] , STUFF( ( SELECT ','+ CONVERT(NVARCHAR,[LastName]) FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS LastNameTable ([id],[LastName]) WHERE [id] = A.[id] ORDER BY [LastName] FOR XML PATH('') ) , 1, 1, '') AS [LastName] FROM ( VALUES (1, 'Kim'), (1, 'Lee'), (2, 'Gu'), (2, 'Baek'), (3, 'Seo') ) AS A ([id],[LastName]) -- GROUP BY A.[id] ; |
728x90
728x90