MSSQL Tips

여러가지 ROW를 하나의 ROW로 만들기

IDTitle
1
1
1
1
2
2
2
2
3


위와같은 테이블이 있습니다.
ID를 기준으로 Title의 텍스트를 comma(,)로 구분지어서 하나의 ROW로 합치고 싶을때 아래 쿼리를 사용합니다.

SELECT DISTINCT
       ID, 
       STUFF((
             SELECT ',' + Title
             FROM    TB_Data b 
             WHERE   b.ID = a.ID
             FOR XML PATH('')
        ),1,1,'') AS NAME 
FROM TB_Data a

아래와 같은 결과가 출력됩니다.

IDTitle
1가,나,다,라
2마,바,사,아,자

STUFF?? FOR XML PATH??

STUFF함수

SUTFF함수는 문자열에서 특정 시작위치에서 지정된 길이만큼 문자를 바꿔줍니다.

SELECT STUFF('CASTLE',3,4,'P')

위 문자열에 대한 치환 결과로 CAP라는 값이 리턴됩니다.

FOR XML PATH

XML기능은 SELECT 문장에 FOR XML절을 추가하여 데이터베이스 엔진에서 쿼리결과를 XML형식으로 반환하도록 지정하거나 할 수 있는 기능입니다.

위 예제에서는 XML 기능의 여러 모드들 중 PATH 모드를 사용하였습니다.

PATH 모드를 추가 할 경우 SELECT되는 각 값마다 PATH()함수에 지정하는 태그로 감쌀수가 있습니다.

ex) FOR XML PATH('ID')일 경우 
<ID>,가</ID><ID>,나</ID><ID>,다</ID><ID>,라</ID>.....

하지만 PATH()함수에 태그명이 공백으로(‘’)들어갈 경우 아래와 같이 값이 나옵니다.

ex) FOR XML PATH('')일 경우 
,가,나,다,라....

위 예제에서는 이렇게 떨어진 값에 STUFF함수로 맨앞에 ,를 제거하여 우리가 목적으로 하는 값을 리턴합니다.

참고

프로그램이 좋다 - 도깨비방망이
DBGuide.net