본문 바로가기

STUDY/SQL, DB

[MySQL] - GROUP_CONCAT()

Leet code에서 아래와 같은 문제를 접했다.

 

[코딩테스트/SQL - Leetcode] - 1484. Group Sold Products By The Date

 

1484. Group Sold Products By The Date

Table Activities: +-------------+---------+ | Column Name | Type | +-------------+---------+ | sell_date | date | | product | varchar | +-------------+---------+ There is no primary key (column with unique values) for this table. It may contain duplicates.

k-wien1589.tistory.com

 

Easy 문제여서 금방 풀고 다음 문제로 넘어가려고 했는데... 웬걸? 아무리 봐도 어떻게 풀어야 할 지 모르겠더라...

아니 이건 Easy 문제인데? 내가 이정도 수준... 일 리가 없지!

 

감도 못 잡겠는 문제가 Easy 문제일 리가 없었다. 그렇다는 건, 내가 모르는 어떤 함수를 이용하면 바로 뚝딱 풀릴 문제라는 것!

 

그리고 내가 몰랐던 그 함수는 GROUP_CONCAT 이라는 함수였다.

 

 

GROUP_CONCAT

1. 어떤 함수인가

 - 여러 ROW에 있는 데이터를 합쳐서 한 번에 가져오는 함수다.

 - 쉽게 말하자면 이름에서도 드러나듯, 그룹(GROUP)별로 데이터를 합치는(CONCAT) 함수다.

 

2. 어떻게 사용하는가

- 이 함수를 알게 해준 Leetcode의 해당 문제로 간단히 사용 예시를 들어보자.

Table : Activity
+------------+------------+
| sell_date  | product    |
+------------+------------+
| 2020-05-30 | Headphone  |
| 2020-06-01 | Pencil     |
| 2020-06-02 | Mask       |
| 2020-05-30 | Basketball |
| 2020-06-01 | Bible      |
| 2020-06-02 | Mask       |
| 2020-05-30 | T-Shirt    |
+------------+------------+


예시 1. 기본 형태 - GROUP_CONCAT(CONCAT 대상 컬럼)

select sell_date
     , group_concat(product)
  from Activities
  group by sell_date
  
Output
+------------+------------------------------+
| sell_date  | group_concat(product)        |
+------------+------------------------------+
| 2020-05-30 | Headphone,Basketball,T-Shirt |
| 2020-06-01 | Pencil,Bible                 |
| 2020-06-02 | Mask,Mask                    |
+------------+------------------------------+




예시 2. 정렬(ORDER BY) - GROUP_CONCAT(CONCAT 대상 컬럼 ORDER BY 컬럼 ASC/DESC)

ORDER BY의 기본값은 ASC이므로 생략하면 오름차순 정렬이 된다.
위의 예시 1에서와 비교해보면 알 수 있는데, ORDER BY 자체를 생략하면 정렬 없이 위에서 아래로
쭉 순서대로 합친다.

(1)
select sell_date
     , group_concat(product order by product)
  from Activities
  group by sell_date

Output
+------------+----------------------------------------+
| sell_date  | group_concat(product order by product) |
+------------+----------------------------------------+
| 2020-05-30 | Basketball,Headphone,T-Shirt           |
| 2020-06-01 | Bible,Pencil                           |
| 2020-06-02 | Mask,Mask                              |
+------------+----------------------------------------+

(2)
select sell_date
     , group_concat(product order by product desc)
  from Activities
  group by sell_date

Output
+------------+---------------------------------------------+
| sell_date  | group_concat(product order by product desc) |
+------------+---------------------------------------------+
| 2020-05-30 | T-Shirt,Headphone,Basketball                |
| 2020-06-01 | Pencil,Bible                                |
| 2020-06-02 | Mask,Mask                                   |
+------------+---------------------------------------------+




예시 3. 구분자 변경(SEPARATOR) - GROUP_CONCAT(CONCAT 대상 컬럼 SEPARATOR '구분자')

해 보면 알겠지만 구분자 자리에는 문자이기만 하면 뭐든 들어갈 수 있다.
위의 예시 1에서와 비교해보면 알 수 있는데, 구분자의 기본값은 콤마(,)이기 때문에
SEPARATOR 자체를 생략하면 콤마로 구분된다

(1)
select sell_date
     , group_concat(product separator ':')
  from Activities
  group by sell_date
  
Output
+------------+-------------------------------------+  
| sell_date  | group_concat(product separator ':') |
+------------+-------------------------------------+  
| 2020-05-30 | Headphone:Basketball:T-Shirt        |
| 2020-06-01 | Pencil:Bible                        |
| 2020-06-02 | Mask:Mask                           |
+------------+-------------------------------------+  

(2)
select sell_date
     , group_concat(product separator 'ㅋㅋ')
  from Activities
  group by sell_date
  
Output
+------------+----------------------------------------+  
| sell_date  | group_concat(product separator 'ㅋㅋ') |
+------------+----------------------------------------+  
| 2020-05-30 | HeadphoneㅋㅋBasketballㅋㅋT-Shirt     |
| 2020-06-01 | PencilㅋㅋBible                        |
| 2020-06-02 | MaskㅋㅋMask                           |
+------------+----------------------------------------+




예시 4. 중복 값 제거(DISTINCT) - GROUP_CONCAT(DISTINCT CONCAT 대상 컬럼)
합쳐진 값에 중복이 있을 경우 제거한다.
예시 1과 비교해 보면 알겠지만, 20년 6월 2일에 MASK가 하나만 출력된다.

select sell_date
     , group_concat(distinct product)
  from Activities
  group by sell_date
  
Output
+------------+--------------------------------+
| sell_date  | group_concat(distinct product) |
+------------+--------------------------------+
| 2020-05-30 | Basketball,Headphone,T-Shirt   |
| 2020-06-01 | Bible,Pencil                   |
| 2020-06-02 | Mask                           |
+------------+--------------------------------+

 

 

이렇게 GROUP_CONCAT() 함수가 어떤 역할을 하는지, 이 함수를 어떻게 사용하는지 간단한 예시를 들어 알아보았다!

 

 

 

** 여담

해당 문제를 GROUP_CONCAT 없이는 풀 수 없을까 싶어서 고민하다가 GPT에게 물어봤다.

 

... 그렇다고 한다;