[ STUFF / FOR XML PATH ] 여러행 하나의 행으로 합치는 방법

2022. 2. 15. 14:27Database/MSSQL

[ STUFF ]
- 문자열의 위치와 길이를 지정하여 다른 문자로 치환하는 함수.
- 예시 : STUFF([문자열], [위치], [길이], [치환할 문자])

[ FOR XML PATH ]
- 쿼리의 실행결과 데이터를 XML 형식으로 표현
- 예시 : FOR XML PATH([row element명])

 

ex)

CASE WHEN COUNT(*) > 1 THEN STUFF(
(
CASE WHEN * <> 'S' 
THEN (
SELECT (CASE WHEN *='S' THEN ',Q' ELSE ',' END) + *
FROM (
SELECT  CONCAT(*,'~',*) AS *
, *
FROM  (
SELECT MIN(*) AS *
, MAX(*) AS *
, MAX(*) AS *
FROM  (
SELECT *
, *
, SUM(*) OVER (ORDER BY *) STEP1_GRP
FROM  (
SELECT * AS *
, (
CASE LAG(CONVERT(NUMERIC, REPLACE(*, '-', ''))) OVER (ORDER BY CONVERT(NUMERIC, REPLACE(*, '-', '')))
WHEN (CONVERT(NUMERIC, REPLACE(*, '-', '')))-1 THEN 0
WHEN (CONVERT(NUMERIC, REPLACE(*, '-', ''))) THEN 0
ELSE 1 
END
) AS *
, * AS *
FROM  * (NOLOCK)
LEFT JOIN * (NOLOCK)
ON * = *
AND * = *
LEFT JOIN * (NOLOCK)
ON * = *
AND * = *
WHERE  * <> 0
AND  ISNULL(*, '') != ''
AND  * = @V_*
AND  * IN (SELECT VALUE FROM DBO.SPLIT(@P_*, ','))
) STEP1
) AS STEP2
GROUP BY STEP2.STEP1_GRP
) A
) V
WHERE  * IN (SELECT VALUE FROM DBO.SPLIT(@P_*, ','))
FOR XML PATH('')
)
ELSE (
SELECT (CASE WHEN *='S' THEN ',Q' ELSE ',' END) + *
FROM ( SELECT  DISTINCT * AS *, *
FROM  * (NOLOCK)
INNER JOIN * (NOLOCK) ON * = *
  AND * = *
INNER JOIN * (NOLOCK) ON * = *
  AND * = *
WHERE  * = *
) V
WHERE  V.SDDOCO IN (SELECT VALUE FROM DBO.SPLIT(@P_*, ','))
FOR XML PATH('')
)
END
)
,1,1,'')
ELSE ''
END AS NOTE, -- 비고

'Database > MSSQL' 카테고리의 다른 글

DISTINCT vs GROUP BY  (0) 2022.02.15
[ PIVOT ] 행을 열로 바꾸기  (0) 2022.02.15
CURSOR  (0) 2022.02.15
MSSQL TIps  (0) 2022.02.15
PROCEDURE Tips  (0) 2022.02.15