SQL/프로그래머스
SQL 프로그래머스6일차_8 GROUP BY , GROUP_CONCAT(), WITH 활용
as_형준
2023. 1. 4. 10:45
우유와 요거트가 담긴 장바구니
- 문제 설명
CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가격을 나타냅니다
- 테이블 소개
- 시도코드
밀크와 요거트 둘다 있어야하는 했는데
in을 써서 or형식으로 되어 고전했다.
SELECT * FROM CART_PRODUCTS
WHERE CART_ID IN (
SELECT CART_ID
FROM CART_PRODUCTS
GROUP BY ID
HAVING NAME IN ('Milk' ,'Yogurt') )
-- 시도 코드 답은 맞은것 같으나 정답은 아니다.
SELECT CART_ID FROM CART_PRODUCTS
WHERE CART_ID IN(
SELECT CART_ID FROM CART_PRODUCTS
WHERE NAME IN ('Milk' ,'Yogurt')
GROUP BY CART_ID
HAVING COUNT(CART_ID) >=2)
GROUP BY CART_ID
ORDER BY CART_ID
- 정답 코드
01.IN을 활용해 WHERE에서 서브쿼리 사용
-- 1.밀크와 요거트가 담긴 카트만 추출
-- 2.카트 ID별로 그룹화 한후 WHERE에서 IN은 OR역할이기 때문에 둘중 하나만 해당되도 추출된다,
-- 3.1개만 추출한걸 제외하고 조회하기 위해 음식의 이름을 중복값을 제거 한후에 숫자를 세어 (밀크+ 요거트) =2 이므로
-- 4. 카운트한 수가 2인 행만 추출한다.
SELECT *, COUNT(DISTINCT NAME )
FROM CART_PRODUCTS
WHERE NAME IN ('Milk','Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME )= 2
ORDER BY CART_ID
02. 인라인 서브쿼리에서 GROUP_CONCAT()을 사용해 CONCAT한 로우에서 조건값을 추가해 추출
# 이건 검색으로 알게됨 GROUP_CONCAT()
-- GROUP_CONCAT()은 컬럼의 중복된 데이터들을 하나의 행에 모두 합친다.
-- INLINE 서브쿼리 활용
-- WHERE에서 OR에 속하는 함수는 사용이 불가하다. 이유즉슨 OR을 쓴다면 우유와 요거트 둘중하나만 속해도 추출되기 때뮨
SELECT CART_ID , NAMES
FROM
(
SELECT CART_ID, GROUP_CONCAT(NAME) AS NAMES
FROM CART_PRODUCTS
GROUP BY CART_ID
) G
WHERE NAMES LIKE '%Milk%' AND NAMES LIKE '%Yogurt%'
ORDER BY CART_ID
03.WITH 를 사용해 조건에 맞는 두개의 쿼리를 만든후 두개의 쿼리를 조인시켜 하나의 커리로 만들었다
# WITH 사용법 익히기
-- WITH 좀 직관적이네
-- CART_ID가 중복값이 있어 DISTINCT로 중복값 제거
WITH M AS (SELECT DISTINCT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Yogurt')
,
H AS (SELECT DISTINCT CART_ID FROM CART_PRODUCTS WHERE NAME ='Milk')
SELECT M.CART_ID
FROM M JOIN H
ON M.CART_ID = H.CART_ID
ORDER BY CART_ID