[SQL] LeetCode 1045. Customers Who Bought All Products

LeetCode 1045. Customers Who Bought All Products 문제를 파헤쳐보자 :)

May 6, 2024
[SQL] LeetCode 1045. Customers Who Bought All Products

1. 문제 설명

1-1. 테이블 설명

1-1-1. Customer 테이블

notion image
✔️ 이 테이블에는 중복되는 행이 포함될 수 있다.
✔️ customer_id가 NULL이 아닙니다.
✔️ product_key는 Product 테이블에 대한 외부 키(참조 열)입니다.
 

1-1-2. Product 테이블

notion image
✔️ product_key는 이 테이블의 기본 키(고유한 값을 가진 열)입니다.
 

1-2. 문제 설명

Product 테이블의 모든 제품을 구입한 Customer 테이블에서 고객 ID를 보고하는 솔루션을 작성합니다.

2. 문제 풀이

2-1. 최종 풀이

SELECT customer_id FROM Customer GROUP BY customer_id HAVING COUNT(DISTINCT product_key) = (SELECT COUNT(*) FROM Product);

2-2. 단계별 풀이

2-2-1. 서브쿼리 만들기

SELECT COUNT(*) FROM Product;
해당 코드를 실행시키면, Product 테이블의 모든 개수를 반환한다.
해당 테이블은 중복된 값 없이 어떠한 상품이 있는지 나열되어 있는 테이블이기 때문에, 해당 코드 실행 시 상품의 개수를 알 수 있다.
 

2-2-2. 기본쿼리 만들기

SELECT customer_id FROM Customer GROUP BY customer_id HAVING COUNT(DISTINCT product_key);
해당 코드를 실행시키면, Customer 테이블의 customer_id 별로 구매한 상품의 개수를 반환한다.
해당 테이블은 중복되는 행이 포함될 수 있으므로 product_key의 개수를 구할 때 꼭 DISTINCT 함수를 써줘야하고, customer_id를 최종 반환해야하기 때문에 customer_id로 꼭 그룹화 해줘야한다.

2-2-3. 합치기

SELECT customer_id FROM Customer GROUP BY customer_id HAVING COUNT(DISTINCT product_key) = (SELECT COUNT(*) FROM Product);
 
해당 코드를 실행시키면, 서브쿼리에서 상품의 개수를 파악하여 이와 일치하는 개수의 상품을 구매한 고객( = 모든 상품을 구매한 고객)을 반환한다.