a,b 컬럼에서
a컬럼이 중복된걸 하나로 하고 (group...)
b컬럼값이 다른것들 중에서 하나는 B컬럼 나머지 값들은 C컬럼에 콤마로 붙여주고싶습니다.
어떻게 하면될까요?
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 기준으로 작성된 쿼리 입니다.
선택 기준이 모호합니다. 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
;