다음을 통해 공유


STRING_AGG(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2017(14.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse AnalyticsSQL 분석 엔드포인트

문자열 식의 값을 연결하고 그 사이에 구분 기호 값을 추가합니다. 구분 기호는 문자열 끝에 추가되지 않습니다.

Transact-SQL 구문 표기 규칙

구문

STRING_AGG ( expression , separator ) [ <order_clause> ]

<order_clause> ::=
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

인수

expression

모든 형식의 . 식은 연결 중에 nvarchar 또는 varchar 형식으로 변환됩니다. 문자열이 아닌 형식은 nvarchar 형식으로 변환됩니다.

separator

연결된 문자열의 구분 기호로 사용되는 nvarchar 또는 varchar 형식의 . 리터럴 또는 변수일 수 있습니다.

<order_clause>

또는 WITHIN GROUP 절을 사용하여 연결된 결과의 순서를 지정합니다.

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
  • <order_by_expression_list>

    결과 정렬에 사용할 수 있는 비상수 의 목록입니다. <order_by_expression_list>은 하나만 허용됩니다. 기본 정렬 순서는 오름차순입니다.

반환 형식

반환 형식은 첫 번째 인수(식)에 따라 다릅니다. 입력 인수가 문자열 형식(nvarchar, varchar)인 경우 결과 형식은 입력 형식과 동일합니다. 다음 표에 자동 변환이 나열되어 있습니다.

입력 식 형식 결과
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
int, bigint, smallint, tinyint, 숫자, float, real, bit,
소수점, smallmoney, money, datetime, datetime2
nvarchar(4000)

설명

STRING_AGG는 행의 모든 식을 하나의 문자열로 연결하는 집계 함수입니다. 식 값은 문자열 형식으로 암시적으로 변환된 다음, 연결됩니다. 문자열에 대한 암시적 변환은 데이터 형식 변환에 대한 기존 규칙을 따릅니다. 데이터 형식 변환에 대한 자세한 내용은 CAST 및 CONVERT참조하세요.

입력 식이 varchar형식인 경우 구분 기호는 nvarchar형식이 될 수 없습니다.

Null 값은 무시되고 해당 구분 기호는 추가되지 않습니다. null 값에 대한 자리 표시자를 반환하려면 예제 B설명된 대로 ISNULL 함수를 사용합니다.

STRING_AGG는 모든 호환성 수준에서 사용할 수 있습니다.

참고

<order_clause>는 데이터베이스 호환성 수준 110 이상에서 사용할 수 있습니다.

이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용합니다.

A. 새 줄에 구분된 이름 목록 생성

다음 예에서는 단일 결과 셀에서 캐리지 리턴으로 구분된 이름 목록을 만듭니다.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO

결과 집합은 다음과 같습니다.

csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...

NULL 셀에 있는 name 값은 결과로 반환되지 않습니다.

참고

SQL Server Management Studio 쿼리 편집기를 사용하는 경우 결과 옵션은 캐리지 리턴을 구현할 수 없습니다. 결과 집합을 올바르게 보려면 텍스트로 결과 표시로 전환하세요. 텍스트에 대한 결과는 기본적으로 256자로 잘립니다. 이 제한을 늘리려면 각 열에 표시할 최대 문자 수 옵션을 변경합니다.

B. NULL 값 없이 쉼표로 구분된 이름 목록 생성

다음 예는 null 값을 '해당 없음'으로 대체하고 하나의 결과 셀에 쉼표로 구분된 이름을 반환합니다.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO

다음은 잘려진 결과 집합입니다.

csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...

C. 쉼표로 구분된 값 생성

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO

다음은 잘려진 결과 집합입니다.

names
-------
Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)
...

참고

Management Studio 쿼리 편집기를 사용하는 경우 결과 옵션은 캐리지 리턴을 구현할 수 없습니다. 결과 집합을 올바르게 보려면 텍스트로 결과 표시로 전환하세요.

아티클과 해당 태그가 서로 다른 테이블로 구분되는 데이터베이스를 가정해 보겠습니다. 한 개발자가 각 아티클당 관련 태그가 모두 포함된 하나의 행을 반환하려고 합니다. 다음 쿼리는 이 결과를 실현합니다.

SELECT a.articleId,
       title,
       STRING_AGG(tag, ',') AS tags
FROM dbo.Article AS a
     LEFT OUTER JOIN dbo.ArticleTag AS t
         ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;
GO

결과 집합은 다음과 같습니다.

articleId title tags
172 Polls indicate close election results politics,polls,city council
176 New highway expected to reduce congestion NULL
177 Dogs continue to be more popular than cats polls,animals

참고

GROUP BY 함수가 STRING_AGG 목록의 유일한 항목이 아닌 경우 SELECT 절이 필요합니다.

E. 도시별 이메일 목록 생성

다음 쿼리는 직원의 메일 주소를 찾고 도시별로 그룹화합니다.

USE AdventureWorks2022;
GO

SELECT TOP 10 City,
              STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') AS emails
FROM Person.BusinessEntityAddress AS BEA
     INNER JOIN Person.Address AS A
         ON BEA.AddressID = A.AddressID
     INNER JOIN Person.EmailAddress AS EA
         ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO

결과 집합은 다음과 같습니다.

참고

결과는 잘린 것으로 표시됩니다.

City emails
Ballard paige28@adventure-works.com;;joshua24@adventure-works.comjavier12@adventure-works.com; ...
Baltimore gilbert9@adventure-works.com
Barstow kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Baytown kelvin15@adventure-works.com
Beaverton billy6@adventure-works.com;;dalton35@adventure-works.comlawrence1@adventure-works.com; ...
Bell Gardens christy8@adventure-works.com
Bellevue min0@adventure-works.com;;gigi0@adventure-works.comterry18@adventure-works.com; ...
Bellflower philip0@adventure-works.com;;emma34@adventure-works.comjorge8@adventure-works.com; ...
Bellingham christopher23@adventure-works.com;;frederick7@adventure-works.comomar0@adventure-works.com; ...

메일 열에 반환된 메일은 특정 도시에서 근무하는 사람들에게 메일을 전송하는 데 직접 사용할 수 있습니다.

F. 도시별 이메일 정렬 목록 생성

다음 쿼리는 이전 예와 유사한 방식으로 직원의 메일 주소를 찾고 도시별로 그룹화한 다음, 메일을 사전순으로 정렬합니다.

USE AdventureWorks2022;
GO

SELECT TOP 10 City,
              STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') WITHIN GROUP (ORDER BY EmailAddress ASC) AS Emails
FROM Person.BusinessEntityAddress AS BEA
     INNER JOIN Person.Address AS A
         ON BEA.AddressID = A.AddressID
     INNER JOIN Person.EmailAddress AS EA
         ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO

결과 집합은 다음과 같습니다.

참고

결과는 잘린 것으로 표시됩니다.

City 전자 메일
Barstow kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Braintree mindy20@adventure-works.com
Bell Gardens christy8@adventure-works.com
Byron louis37@adventure-works.com
Bordeaux ranjit0@adventure-works.com
Carnation don0@adventure-works.com;;douglas0@adventure-works.comgeorge0@adventure-works.com; ...
Boulogne-Billancourt allen12@adventure-works.com;;bethany15@adventure-works.comcarl5@adventure-works.com; ...
Berkshire barbara41@adventure-works.com;;brenda4@adventure-works.comcarrie14@adventure-works.com; ...
Berks adriana6@adventure-works.com;;alisha13@adventure-works.comarthur19@adventure-works.com; ...