SQL

SQL 코드카타 오답: DISTINCT의 중요성 | AND와 OR

sawo11 2024. 12. 10. 12:14

[우유와 요거트가 담긴 장바구니]

데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

-- 내가 작성한 쿼리
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk' OR NAME = 'Yogurt'
GROUP BY CART_ID
HAVING COUNT(NAME) >= 2
ORDER BY CART_ID

-- 정답 쿼리
-- **DISTINCT의 중요성**
-- 고유값을 COUNT 했을 때 2보다 크거나 같아야 Milk와 Yogurt를 포함한 것
-- 2이면 Milk와 Yogurt만 포함, 2보다 크면 다른 것도 포함
-- AND가 아니라 OR인 이유: GROUP BY 전에는 Milk와 Yogurt가 동시에 있을 수 없음
-- HAVING절의 조건 없이 NAME을 출력했을 때는 NAME값이 1개만 출력되지만 COUNT(DISTINCT NAME)이 2보다 크거나 같다는 조건을 부여할 수 있는 이유
-- 값은 1개만 출력되었지만 실제로는 여러개가 담겨있기 때문
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk' OR NAME = 'Yogurt'
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) >= 2
ORDER BY CART_ID

-- 피드백 (디벨롭)
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUP BY 1
HAVING COUNT(DISTINCT NAME) >= 2
ORDER BY 1;