Database

[MySQL] GROUP_CONCAT - 그룹 별 행 압축

비번변경 2024. 9. 25. 11:59

개요

여러 값이 저장되어 있는 테이블에서 특정 컬럼에 그룹 별로 값이 어떤 것들이 있는지 확인하고 싶다. 이럴 때는 그룹 별로 여러 행의 데이터를 하나의 필드로 연결하는 GROUP_CONCAT 함수를 사용할 수 있다. 

사용법을 적어둔다.

 

 

GROUP_CONCAT

GROUP_CONCAT은 여러 행의 데이터를 하나의 필드로 연결하는데 사용하는 함수이다. 그룹에 NULL이 아닌 값이 포함되어 있으면 문자열 값을 반환하는 집계 함수로, 그룹에 값이 전부 NULL이면 NULL을 반환한다.

SELECT GROUP_CONCAT ( [DISTINCT] col_name1 [ORDER BY 절] [SEPARATOR str_val] ) 
FROM 테이블_이름 
GROUP BY 그룹화_기준_열;

 

 

예시

다음과 같이 물건의 유형과 이름을 저장하는 테이블이 있다고 하자. 

| type   | name |
| ------ | ---- |
| fruit  | 수박   |
| fruit  | 사과   |
| fruit  | 사과  |
| cooker | 뒤집개  |

 

DDL

더보기
CREATE TABLE test (
  type varchar(50),
  name varchar(50)
);
INSERT INTO test VALUES ('fruit', '수박');
INSERT INTO test VALUES ('fruit', '사과');
INSERT INTO test VALUES ('fruit', '사과');
INSERT INTO test VALUES ('cooker', '뒤집개');

물건의 유형별로 이름을 한 행으로 보고 싶다면 아래와 같이 type 별로 그룹화한 다음, GROUP_CONCAT 함수에 name을 전달하면 된다.

SELECT type
     , GROUP_CONCAT(name)
FROM test
GROUP BY type
;

 

실행 결과

| type   | GROUP_CONCAT(name) |
| ------ | ------------------ |
| cooker | 뒤집개                |
| fruit  | 수박,사과,사과           |

 

 

구분자 변경

GROUP_CONCAT 함수는 기본적으로 쉼표를 구분자로 사용하며, 만약 구분자를 변경하고 싶다면 SEPARATOR를 전달하면 된다.

SELECT type
     , GROUP_CONCAT(name SEPARATOR '|')
FROM test
GROUP BY type
;

 

실행 결과

| type   | GROUP_CONCAT(name SEPARATOR '|') |
| ------ | -------------------------------- |
| cooker | 뒤집개                              |
| fruit  | 수박|사과|사과                         |

 

 

중복 제거

중복을 제거할 때에는 GROUP_CONCAT 함수에 DISTINCT를 사용하면 된다.

SELECT type
     , GROUP_CONCAT(DISTINCT name)
FROM test
GROUP BY type
;

 

실행 결과

| type   | GROUP_CONCAT(DISTINCT name) |
| ------ | --------------------------- |
| cooker | 뒤집개                         |
| fruit  | 사과,수박                       |

 

 

참고 문서

https://fruitdev.tistory.com/16