작은 콩 개발자/SQL

[mssql] 두 행을 하나로 합치는 쿼리 (STUFF, XML PATH)

귤치치 2023. 5. 30. 14:28

 

[mssql] 두 행을 하나로 합치는 쿼리 (STUFF, XML PATH)

위의 두 행을 하나로 보여주어야 한다. 정비지원장비사업자, nsss 제작사 이렇게 한 행으로 보여져야 하는 경우…

 

기존 쿼리
-- 기존 쿼리
SELECT 
    BIZ_CD_NM
FROM 
    SPM_BIZ_CODE
WHERE 
    BIZ_CD_SEQ IN ('49545','49546')

Stuff (문자열, 위치, 길이, 치환 할 문자)

SELECT 
    STUFF( BIZ_CD_SEQ, 1, 1, ',') AS BIZ_CD_SEQ
FROM 
      SPM_BIZ_CODE 
 WHERE 
    BIZ_CD_SEQ IN ('49545','49546')

 

XML PATH : XML 로 만들어줌

SELECT 
    BIZ_CD_NM
FROM 
    SPM_BIZ_CODE
WHERE 
    BIZ_CD_SEQ IN ('49545','49546')
FOR XML PATH('')

 

Stuff, XML PATH

-- STUFF (문자열, 위치, 길이, 치환 할 문자)
-- XML PATH
SELECT 
DISTINCT STUFF((SELECT ',' + BIZ_CD_NM
                FROM SPM_BIZ_CODE
                 WHERE BIZ_CD_SEQ IN ('49545','49546')
                 FOR XML PATH('')
       ), 1, 1, '') AS enames
  FROM SPM_BIZ_CODE

 

적용한 쿼리

SELECT
    DISTINCT -- 작성중일때 수신기관 합침.
    DOC.CORR_NO
    , DOC.CORR_TITLE
    , DOC.CORR_STATUS_CD
    , DOC.SEND_USER_SEQ
    , DOC.SEND_INST_SEQ
    , INST.CORR_SEQ
    , INST.INST_TYPE_CD
    , INST.BIZ_CD_SEQ
    , INST.RECEP_STATUS_CD
    , INST.RECEP_USER_SEQ
    , DBO.GETUSERNM(INST.RECEP_USER_SEQ) AS RECEPTION_USER_NM
    , INST.RECEP_DT
    , INST_SEND.RECEP_USER_SEQ AS SEND_USER_SEQ -- 발송
    , DBO.GETUSERNM(INST_SEND.RECEP_USER_SEQ) AS SEND_USER_NM
    , INST_SEND.RECEP_DT AS SEND_DT
    , DBO.GETCOMPANYNM(INST_SEND.RECEP_USER_SEQ) AS SEND_INST_NM
    , INST_RECEIVE.RECEP_USER_SEQ AS RECEIVE_USER_SEQ -- 수신
    , DBO.GETUSERNM(INST_RECEIVE.RECEP_USER_SEQ) AS RECEIVE_USER_NM
    , INST_RECEIVE.RECEP_DT AS RECEIVE_DT
    , CASE 
        WHEN DOC.CORR_STATUS_CD = 'WRITING' -- 작성중
        THEN STUFF((SELECT ',' + BIZ_CD_NM
                    FROM SPM_BIZ_CODE
                     WHERE BIZ_CD_SEQ IN (SELECT BIZ_CD_SEQ FROM DOM_DOC_INSTITUTE WHERE CORR_SEQ = INST.CORR_SEQ AND INST_TYPE_CD = 'RECEIVE') 
                     FOR XML PATH('')), 1, 1, '')  
        ELSE (SELECT BIZ_CD_NM FROM SPM_BIZ_CODE WHERE BIZ_CD_SEQ = INST_RECEIVE.BIZ_CD_SEQ) END
        AS RECEIVE_INST_NM
    , INST_RECEPTION.RECEP_USER_SEQ AS RECEPTION_USER_SEQ -- 접수
    , DBO.GETUSERNM(INST_RECEPTION.RECEP_USER_SEQ) AS RECEPTION_USER_NM
    , INST_RECEPTION.RECEP_DT AS RECEPTION_DT
    , (SELECT BIZ_CD_NM FROM SPM_BIZ_CODE WHERE BIZ_CD_SEQ = INST_RECEPTION.BIZ_CD_SEQ) AS RECEPTION_INST_NM
FROM
    DOM_DOC_INSTITUTE INST
    INNER JOIN DOM_DOC DOC
        ON DOC.CORR_SEQ = INST.CORR_SEQ
        AND DOC.DEL_YN = 'N'
        AND DOC.PARENT_CORR_SEQ != DOC.CORR_SEQ
    LEFT JOIN DOM_DOC_INSTITUTE INST_SEND -- 발송
        ON INST_SEND.CORR_SEQ = INST.CORR_SEQ
        AND INST_SEND.INST_TYPE_CD = 'SEND'
        AND INST_SEND.DEL_YN = 'N'
    LEFT JOIN DOM_DOC_INSTITUTE INST_RECEIVE -- 수신
        ON INST_RECEIVE.CORR_SEQ = INST.CORR_SEQ
        AND INST_RECEIVE.INST_TYPE_CD = 'RECEIVE'
        AND INST_RECEIVE.DEL_YN = 'N'
    LEFT JOIN DOM_DOC_INSTITUTE INST_RECEPTION -- 접수
        ON INST_RECEPTION.CORR_SEQ = INST.CORR_SEQ
        AND INST_RECEPTION.INST_TYPE_CD = 'RECEPTION'
        AND INST_RECEPTION.DEL_YN = 'N'
WHERE
    INST.BIZ_CD_SEQ = '2'
    AND INST.INST_TYPE_CD = 'SEND'
    AND INST.DEL_YN = 'N'
    AND INST.RECEP_USER_SEQ = '1'