본문 바로가기
마루아라는 개발쟁이/MS.SQL

MSSQL 결과값을 한 ROW에 합치기

by 마루아라 이야기 2024. 8. 21.
반응형

MSSQL에서 STUFF 함수를 사용하여 NUM이 같은 NAME끼리 묶어 콤마(,)로 합치는 방법입니다.

쿼리 요약

주어진 데이터에서 NUM이 같은 NAME을 콤마로 연결하여 출력하는 쿼리는 다음과 같습니다:

SELECT X.NUM, X.NAME
FROM (
    SELECT A.NUM,
           STUFF((SELECT ', ' + NAME 
                  FROM #TEMP 
                  WHERE NUM = A.NUM 
                  FOR XML PATH('')), 1, 2, '') AS NAME
    FROM #TEMP AS A 
    GROUP BY A.NUM
) X

쿼리 설명

  1. 서브쿼리: STUFF 함수와 FOR XML PATH를 사용하여 NUM이 같은 NAME들을 콤마로 연결합니다.
    • FOR XML PATH('')는 결과를 XML 형식으로 반환하여 문자열을 하나로 합치는 데 사용됩니다.
  2. STUFF 함수:
    • STUFF(expression, start, length, replace_expression)에서:
      • expression: 합쳐진 문자열.
      • start: 문자열에서 삭제를 시작할 위치.
      • length: 삭제할 길이.
      • replace_expression: 삭제된 위치에 삽입할 문자열.
    • 이 쿼리에서는 start가 1, length가 2로 설정되어 콤마와 공백을 제거합니다.

STUFF 함수 사용 예

  1. 첫 번째 예: start=1, length=0
    • 결과: 문자열의 가장 앞에 ", "가 붙어 있는 상태입니다.
      STUFF((SELECT ', ' + NAME FROM #TEMP WHERE NUM=A.NUM FOR XML PATH('')), 1, 0, '')
      
  2. 두 번째 예: start=1, length=1
    • 결과: 가장 첫 번째 문자에서 1자리 삭제하여 콤마(',')가 제거됩니다.
      STUFF((SELECT ', ' + NAME FROM #TEMP WHERE NUM=A.NUM FOR XML PATH('')), 1, 1, '')
      
  3. 세 번째 예: start=1, length=2
    • 결과: 콤마와 스페이스를 모두 제거한 최종 결과입니다.
      STUFF((SELECT ', ' + NAME FROM #TEMP WHERE NUM=A.NUM FOR XML PATH('')), 1, 2, '')
      
  4. 네 번째 예: 문자열 대체
    • 결과: 삭제된 부분에 "LIST: "를 삽입합니다.
      STUFF((SELECT ', ' + NAME FROM #TEMP WHERE NUM=A.NUM FOR XML PATH('')), 1, 2, '이름: ')

최종 결과

위 쿼리를 실행하면 NUM별로 NAME이 콤마로 연결된 결과를 얻을 수 있습니다. 예를 들어, 데이터가 다음과 같을 경우:

NUM NAME
1 KIM
1 LEE
2 PARK
2 CHOI

 

결과는 다음과 같습니다

NUM NAME
1 이름: KIM, LEE
2 이름 :  PARK, CHOI

 

결론

STUFF 함수와 FOR XML PATH를 사용하면 MSSQL에서 문자열을 효과적으로 연결할 수 있습니다.

728x90
반응형
LIST