본문 바로가기
DataBase/MS-SQL

[MS-SQL] 그룹별 ROW(행) 문자열 결과 합치기 (STUFF, FOR XML PATH 활용)

by 너울림 2023. 1. 3.

그룹별 ROW(행) 문자열 결과 합치기 (STUFF, FOR XML PATH 활용)

 

그룹별 ROW(행) 문자열 결과 합치기 (STUFF, FOR XML PATH 활용)

 


포스팅 개요


오늘 포스팅 예제 쿼리는 검색한 테이블의 ROW(행) 문자열의 결과를 원하는 방식으로 합쳐서 표기하는 방법입니다. 다만 사용되는 구문의 의미는 이해하기가 어려우니 규칙성을 인지하여 상황에 맞게 대응하는 것이 좋습니다.

  • 예제 쿼리의 STUFF는 MSDN에서는 "다른 문자열에 문자열을 삽입합니다"라고 정의되어 있습니다. 
  • 예제 쿼리의 FOR XML PATH는 MSDN에서 "SELCT 결과를 XML 형태로 반환하는 FOR XML문의 PATH 모드"라고 정의 되어있습니다. 
  • 이제 예제 쿼리를 확인하기 전 아래의 그림을 참고하여 테스트 결과를 미리 확인해 보시길 바랍니다.

실행 결과

 


예제 쿼리


지난 포스팅에서 사용한 TEST 테이블을 그대로 사용하겠습니다.

2023.01.02 - [DataBase/MS-SQL] - [MSSQL] 중복 테이블 삭제 후에 다시 테이블 생성(CREATE)하기

이전에 만든 예제 테이블 (링크 참고)


예제(1)
TEST 테이블을 이용하여 일자별 구매품을 콤마(,)로 구분하여 나열합니다.

-- 일자별 구매내역
SELECT 
	[In_Date] '구매일자', 
	STUFF((SELECT DISTINCT ',' + [Stock] FROM Test_Table t2 
	       WHERE t1.[In_Date] = t2.[In_Date] FOR XML PATH('')),1,1,'') '구매내역' 
FROM Test_Table t1 
GROUP BY [In_Date]


예제(2)
TEST 테이블을 이용하여 사원별 구매품을 콤마(,)로 구분하여 나열합니다.

-- 사원별 구매내역
SELECT 
	[Employee] '사원', 
	STUFF((SELECT DISTINCT ',' + [Stock] FROM Test_Table t2 
	       WHERE t1.[Employee] = t2.[Employee] FOR XML PATH('')),1,1,'') '구매내역' 
FROM Test_Table t1 
GROUP BY [Employee]

 


실행 결과


테이블 생성부터 각 쿼리에 맞는 결과를 표기합니다. 필요에 따라 컬럼과 그룹을 조정하는 활용이 가능합니다

예제(1),(2) 실제 결과창


참고 링크

 

https://learn.microsoft.com/ko-kr/sql/t-sql/functions/stuff-transact-sql?f1url=%3FappId%3DDev15IDEF1%26l%3DKO-KR%26k%3Dk(STUFF_TSQL)%3Bk(sql13.swb.tsqlresults.f1)%3Bk(sql13.swb.tsqlquery.f1)%3Bk(MiscellaneousFilesProject)%3Bk(DevLang-TSQL)%26rd%3Dtrue&view=sql-server-ver16 

 

STUFF(Transact-SQL) - SQL Server

STUFF 함수는 다른 문자열에 문자열을 삽입합니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/sql/relational-databases/xml/examples-using-path-mode?source=recommendations&view=sql-server-ver16 

 

예제: PATH 모드 사용 - SQL Server

SELECT 쿼리에서 XML을 생성하기 위해 PATH 모드를 사용하는 예제를 살펴봅니다.

learn.microsoft.com

댓글