멈재

[DB, MySQL] 조건에 맞는 값 그룹 형태로 출력 (GROUP_CONCAT) 본문

카테고리 없음

[DB, MySQL] 조건에 맞는 값 그룹 형태로 출력 (GROUP_CONCAT)

멈재 2023. 12. 25. 16:28
728x90

하나의 그룹에 포함되는 특정 컬럼의 목록들을 조회해야 하는 상황이 종종 있습니다.
 
아래와 같은 형태의 테이블 스키마 구조를 가지고 있다고 가정해 보겠습니다.
해당 테이블은 납품 업체와 제휴를 맺고 있는 파트너사의 가맹점들이 상품(product_name) 발주 요청을 관리하는 테이블입니다.

CREATE TABLE `order_form` (
    `order_form_id` int NOT NULL AUTO_INCREMENT,
    `partner_name` varchar(50) NOT NULL,
    `partner_code` varchar(20) NOT NULL,
    `product_name` varchar(50) NOT NULL,
    `request_dt` datetime DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`order_form_id`)
) ENGINE=InnoDB;

 
동일한 파트너사에 다양한 가맹점들이 존재할 수 있고 각각의 가맹점은 고유한 키(partner_code)를 가지고 있습니다.
 
따라서 다음과 같은 값들이 저장되어 있다고 가정해 보겠습니다.

INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB01', '설탕');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB01', '시럽');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB02', '에스프레소 원두');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('투썸플레이스', 'TS01', '계랑스푼');

 
하나의 가맹점이라는 조건을 조회하고 싶을 때에는 이러한 쿼리를 만들어 조회하게 됩니다.

SELECT partner_code,
       COUNT(partner_code) AS count
  FROM order_form
 GROUP BY partner_code;

 
그런데 각각의 가맹점마다 요청한 상품 목록들을 함께 보여주어야 하는 상황이 생겨버렸습니다.
이럴 때 유용한 함수가 바로 GROUP_CONCAT입니다.
 
GROUP_CONCAT 함수는 그룹화된 항목의 특정 항목을 연결된 문자열로 반환하는 함수입니다.
https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat

MySQL :: MySQL 8.0 Reference Manual :: 12.19.1 Aggregate Function Descriptions

MySQL 8.0 Reference Manual  /  ...  /  Functions and Operators  /  Aggregate Functions  /  Aggregate Function Descriptions 12.19.1 Aggregate Function Descriptions This section describes aggregate functions that operate on sets of values. They are

dev.mysql.com

 
해당 함수를 사용하여 조회를 하게 되면 다음과 같은 결과를 얻을 수 있습니다.

SELECT partner_code,
       COUNT(partner_code) AS count,
       GROUP_CONCAT(product_name) AS product_name_group
  FROM order_form
 GROUP BY partner_code;

 
별도의 설정없이 없다면 각각의 문자들을 쉼표(', ') 구분자로 구분되어 연결 지어 반환하게 됩니다.
 
 
아래와 같은 기능들도 가능합니다.
 
[ 1 ] 중복된 상품명은 한 번만 보이게 조회 ( DISTINCT )

SELECT partner_code,
       COUNT(partner_code) AS count,
       GROUP_CONCAT(DISTINCT product_name) AS product_name_group
  FROM order_form
 GROUP BY partner_code;

 
 
[ 2 ] 문자열 구분자 변경 ( SEPARATOR )
( 공백 포함한 구분자도 가능합니다 )

SELECT partner_code,
       COUNT(partner_code) AS count,
       GROUP_CONCAT(DISTINCT product_name SEPARATOR ' ### ') AS product_name_group
  FROM order_form
 GROUP BY partner_code;

 
 
[ 3 ] 정렬 순서 변경 ( ORDER BY )

SELECT partner_code,
       COUNT(partner_code) AS count,
       GROUP_CONCAT(DISTINCT product_name 
                    ORDER BY product_name DESC 
                    SEPARATOR ' ### ') AS product_name_group
  FROM order_form
 GROUP BY partner_code;