문제
💡 Write a solution to report the products that were only sold in the first quarter of 2019. That is, between 2019-01-01 and 2019-03-31 inclusive. Return the result table in any order.
테이블 형태
풀이
SELECT p.product_id
, product_name
FROM Product as p
JOIN Sales as s ON p.product_id=s.product_id
GROUP BY s.product_id
HAVING MIN(sale_date) >= '2019-01-01' AND MAX(sale_date) <= '2019-03-31'
해설
FROM Product as p
JOIN Sales as s ON p.product_id=s.product_id
- 19년 1분기에만 팔린 제품ID와 제품명을 출력하는 문제다.
- 특정 분기에만 팔린( Sales(s) 테이블의 판매일자 데이터 활용) 제품 정보를 출력해야 하므로( Product(p) 테이블의 제품명 데이터 활용) product_id를 기준으로 조인하되, 19년 1분기 날짜 조건이 누락되면 안되므로 테이블S가 모두 보존되도록 RIGHT JOIN 한다. 테이블S에서 판매된 제품이 테이블P에 정보가 없을 가능성이 낮기에 INNER JOIN도 가능하지만, 만일의 경우를 위해 테이블S의 날짜 데이터가 모두 보존되는 RIGHT JOIN을 사용하였다.
GROUP BY s.product_id
HAVING MIN(sale_date) >= '2019-01-01' AND MAX(sale_date) <= '2019-03-31'
- 각 제품마다 팔린 날짜 기록을 확인하고 조건날짜에 해당되는 제품만 남기기 위해 product_id 를 기준으로 GROUP BY한다.
- 조건을 충족하는 그룹만 남기기 위해 HAVING문을 사용해 sale_date 의 최소날짜가 19-01-01보다 크거나 같고, sale_date 의 최대날짜가 19-03-31보다 작거나 같은 제품만 필터링한다⭐ 그러면 조건을 충족하는 제품만 남게 된다.
SELECT p.product_id
, product_name
- 제품ID와 제품명을 SELECT절에 넣어 출력해준다.
'SQL > 코딩테스트' 카테고리의 다른 글
[프로그래머스 / MySQL] 최댓값 구하기 (0) | 2024.01.31 |
---|---|
[leetcode / MySQL] 1045. Customers Who Bought All Products (0) | 2024.01.30 |
[leetcode / MySQL] 184. Department Highest Salary (0) | 2024.01.30 |
[프로그래머스 / MySQL] 입양 시각 구하기(1) (0) | 2024.01.30 |
[프로그래머스 / MySQL] 가격대 별 상품 개수 구하기 (0) | 2024.01.30 |