공부/SQL

[MySQL] 여러 row의 데이터를 한 row에 합치기 - GROUP_CONCAT

yeonstudy 2022. 9. 13. 15:50

내가 관리? 하는 ㅋㅋ 데이터 중 다음과 같은 형식의 데이터들이 있다.  

예시를 들자면 ... 

제품 ID (ID) 제품 판매점 (STORE_CD)
M001 서울 지점
M002 서울 지점
M002 부산 지점
M003 서울 지점
M003 부산 지점
M003 대구 지점
M003 제주 지점
... ...

제품의 마스터 테이블은 따로 있고, 판매하는 지점 테이블은 후에 분석을 해야 하기 때문에 마스터 테이블에 한 컬럼으로 추가하지 않고 별개의 테이블을 생성해서 저장하고 있는 것으로 보인다. (설계 단계 때 참여한 게 아니라 왜 이런 식으로 만들었는지 모름...) 

 

제품의 다양한 값들을 unique하게 추출해달라는 요청이 있었는데, 제품 마스터 테이블과 판매 지점 테이블을 INNER JOIN하면 제품 판매점 row 수만큼 데이터가 무한정 늘어나기 때문에 해당 데이터들을 한 row에 합쳐야 했다.

 

이러한 상황, 즉 여러 row 데이터를 한 row에 합쳐야 할 때에는 GROUP_CONCAT 함수를 사용하면 된다.

기본 문법은 다음과 같다. 

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val]
             [LIMIT {[offset,] row_count | row_count OFFSET offset}])

 

정말 기본적으로 GROUP_CONCAT 함수를 사용해 보았다.

SELECT ID, GROUP_CONCAT(STORE_CD) AS STORES
FROM STORE_TABLE
GROUP BY ID

실행 결과는 다음과 같다. 

ID STORES
M001 서울 지점
M002 서울 지점,부산 지점
M003 서울 지점,부산 지점,대구 지점,제주 지점
... ...

SEPARATOR 파라미터를 따로 지정해주는 것이 아니라면, 무조건 쉼표를 사용한다. 

 

SEPARATOR를 사용한다면 실행 결과는 다음과 같다. 

SELECT ID, GROUP_CONCAT(STORE_CD SEPARATOR ' ') AS STORES
FROM STORE_TABLE
GROUP BY ID

실행 결과는 다음과 같다. 

ID STORES
M001 서울 지점
M002 서울 지점 부산 지점
M003 서울 지점 부산 지점 대구 지점 제주 지점
... ...

 

처음에 이 함수를 몰라서 검색할 때, how to sum rows in mysql 이런 식으로 검색하다가 진짜 sum 함수 설명만 줄줄히 보고 나왔다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ merge라고 검색하면 나옴...