| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 데이터리안
- Datarian
- row_number
- funnel
- advent of sql
- LEFTJOIN
- SolveSQL
- 리텐션
- 신입 데이터분석가
- leetcode
- MYSQL
- SQL
- 취준
- 린분석
- pandas
- regexp
- 독서
- 프로그래머스
- 데이터분석
- 윈도우 함수
- Retention
- 그로스해킹
- 퍼널분석
- 서브쿼리
- 순위함수
- 누적합
- 윈도우함수
- rank
- dense_rank
- python
- Today
- Total
데이터 분석
우유와 요거트가 담긴 장바구니 | Lv.4 | GROUP_CONCAT💡 본문
문제
데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

먼저, CONCAT 함수와 CONCAT_WS 함수를 짚고 넘어가자.
이 두 string 함수의 공통점은 서로 다른 두 칼럼 값을 연결할 때 사용하기 유용하다는 점이다.
한편, 차이점은 CONCAT_WS 함수는 Separator(구분자)를 인수에 명시적으로 지정할 수 있다는 것이다.
SELECT CONCAT(NAME, PRICE) AS con1
, CONCAT(NAME, '-', PRICE) AS con2
, CONCAT_WS('', NAME, PRICE) AS con_ws1
, CONCAT_WS('-', NAME, PRICE) AS con_ws2
FROM cart_products
LIMIT 3

하지만, 이 문제를 해결하기 위해서는 cart_id별 name 칼럼 값을 연결해줘야 한다. 즉, 서로 다른 두 칼럼 값이 아닌 하나의 컬럼의 여러 값을 연결하는 목적을 갖는다.
따라서 GROUP_CONCAT 함수를 활용하여 문제를 해결했다.
물론 이 함수도 서로 다른 두 칼럼 값을 연결할 수 있다는 점을 참고하도록!
풀이
WITH step1 AS (
SELECT cart_id
, GROUP_CONCAT(DISTINCT name SEPARATOR ' ') AS con_name
FROM cart_products
GROUP BY cart_id
)
SELECT cart_id
FROM step1
WHERE REGEXP_LIKE(con_name, 'Milk')
AND REGEXP_LIKE(con_name, 'Yogurt') -- con_name LIKE '%Milk%' AND con_name LIKE '%Yogurt%'
-- con_name REGEXP 'Milk' AND con_name REGEXP 'Yogurt'
ORDER BY cart_id
/* CTE 없이
SELECT cart_id
FROM cart_products
GROUP BY cart_id
HAVING GROUP_CONCAT(DISTINCT name, price SEPARATOR ' ') REGEXP 'Milk' AND GROUP_CONCAT(DISTINCT name, price SEPARATOR ' ') REGEXP 'Yogurt'
ORDER BY cart_id
*/
✅ WITH 절 :
cart_id 칼럼 기준으로 name 칼럼 값을 연결하고 중복 값을 제거하기 위해 DISTINCT 절을 사용한다. 이 과정에서 연결할 때 값 사이에 공백을 두기 위해, SEPARATOR 을 명시
*SEPARATOR 인수의 기본값 is , (comma)
✅ 메인 쿼리 :
우유와 요거트를 동시에 구입한 경우를 조회하기 위해 WHERE절에 REGEXP_LIKE를 활용
💡참고로, 만약 우유 또는 요거트를 구입한 경우를 알고자 한다면?
➡️REGEXP_LIKE(con_name, 'Milk|Yogurt') 활용 가능
📢REGEXP_LIKE 내에서 AND 연산을 구현하는 방법은 없다고 한다‼️
https://dev.mysql.com/doc/refman/9.1/en/aggregate-functions.html#function_group-concat
MySQL :: MySQL 9.1 Reference Manual :: 14.19.1 Aggregate Function Descriptions
14.19.1 Aggregate Function Descriptions This section describes aggregate functions that operate on sets of values. They are often used with a GROUP BY clause to group values into subsets. Table 14.29 Aggregate Functions Name Description AVG() Return the
dev.mysql.com
https://dev.mysql.com/doc/refman/9.1/en/string-functions.html#function_concat-ws
MySQL :: MySQL 9.1 Reference Manual :: 14.8 String Functions and Operators
14.8 String Functions and Operators Table 14.12 String Functions and Operators Name Description ASCII() Return numeric value of left-most character BIN() Return a string containing binary representation of a number BIT_LENGTH() Return length of argument
dev.mysql.com
'SQL > 프로그래머스' 카테고리의 다른 글
| 보호소에서 중성화한 동물 | Lv.4 (0) | 2025.04.24 |
|---|---|
| 자동차 대여 기록 별 대여 금액 구하기 | Lv.4 (1) | 2025.04.21 |
| 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 | Lv.4💡 (0) | 2025.04.14 |
| 오랜 기간 보호한 동물(2) | Lv.3 (0) | 2025.04.08 |
| 자동차 대여 기록에서 '대여중 / 대여 가능' 구분하기 | Lv.3💡 (0) | 2025.04.07 |