mssql 여러행 합쳐서 1개행으로 만드는 것 질문 2

by 제이 [SQLServer] SQL query [2022.02.21 10:26:11]


a,b 컬럼에서

a컬럼이 중복된걸 하나로 하고 (group...)

b컬럼값이 다른것들 중에서 하나는 B컬럼 나머지 값들은 C컬럼에 콤마로 붙여주고싶습니다.

어떻게 하면될까요?

by 우주민 [2022.02.21 10:47:30]
WITH SUB1 AS (
SELECT 
T1.*
,ROW_NUMBER() OVER(PARTITION BY A) AS RN -- 동일한 A 컬럼 내의 순번 생성
FROM TEST_TABLE T1
)
SELECT T1.A, T1.B, IFNULL(T2.C,'') AS C
FROM SUB1 T1
LEFT OUTER JOIN 
	(
      SELECT 
      A
      ,GROUP_CONCAT(B) AS  C -- B 컬럼을 A 컬럼 기준으로 CONCAT(텍스트 합침)
      FROM SUB1
      WHERE RN > 1 -- 순번이 1보다 큰 항목(C에 기술될 항목) 필터링
      GROUP BY A
	) T2
ON T1.A = T2.A
WHERE T1.RN = 1 -- 기준이 되는 항목(결과물 B에 기술될) 필터

 

MYSQL 기준으로 작성된 쿼리 입니다.


by 마농 [2022.02.21 11:29:59]

선택 기준이 모호합니다. 3개중 1개가 선택되어지는 기준이 있어야 합니다.
B 컬럼으로 정렬한다고 가정 했을때는 원하는 결과표와 다르게 나오게 됩니다.

WITH t AS
(
SELECT 1 a, 'apple' b
UNION ALL SELECT 1, 'orange'
UNION ALL SELECT 1, 'cake'
UNION ALL SELECT 2, 'rule'
UNION ALL SELECT 3, 'pain'
UNION ALL SELECT 3, 'tail'
UNION ALL SELECT 3, 'coal'
)
SELECT a
     , MIN(CASE WHEN rn = 1 THEN b END) b
     , STRING_AGG(CASE WHEN rn > 1 THEN b END, ',') c
  FROM (SELECT a, b
             , ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) rn
          FROM t
        ) a
 GROUP BY a
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입