[SQL#125 List the Products Ordered in a Period]

Gi Woon Lee·2024년 9월 14일

SQL

목록 보기
19/33

TIL (Today I Learned): SQL에서 특정 기간에 주문된 제품 목록 출력하기

문제 이해

  • Products 테이블:

    • : product_id, product_name, product_category
    • product_id는 Primary Key로, 회사의 제품 정보를 담고 있음.
  • Orders 테이블:

    • : product_id, order_date, unit
    • product_id는 Products 테이블의 Foreign Key이며, unit은 해당 날짜에 주문된 제품의 수량을 나타냄.
    • 중복 행이 있을 수 있음.

문제 요구 사항

  • 2020년 2월에 주문된 제품 중 총 주문 수량이 100개 이상인 제품의 이름을 반환하라.

입력 예시

Products 테이블:

+-------------+-----------------------+------------------+
| product_id  | product_name          | product_category |
+-------------+-----------------------+------------------+
| 1           | Leetcode Solutions    | Book             |
| 2           | Jewels of Stringology | Book             |
| 3           | HP                    | Laptop           |
| 4           | Lenovo                | Laptop           |
| 5           | Leetcode Kit          | T-shirt          |
+-------------+-----------------------+------------------+

Orders 테이블:

+--------------+--------------+----------+
| product_id   | order_date   | unit     |
+--------------+--------------+----------+
| 1            | 2020-02-05   | 60       |
| 1            | 2020-02-10   | 70       |
| 2            | 2020-01-18   | 30       |
| 2            | 2020-02-11   | 80       |
| 3            | 2020-02-17   | 2        |
| 3            | 2020-02-24   | 3        |
| 4            | 2020-03-01   | 20       |
| 4            | 2020-03-04   | 30       |
| 4            | 2020-03-04   | 60       |
| 5            | 2020-02-25   | 50       |
| 5            | 2020-02-27   | 50       |
| 5            | 2020-03-01   | 50       |
+--------------+--------------+----------+

출력 예시:

+--------------------+---------+
| product_name       | unit    |
+--------------------+---------+
| Leetcode Solutions | 130     |
| Leetcode Kit       | 100     |
+--------------------+---------+

문제 해결 전략

  • Orders 테이블에서 product_id별로 그룹화하여, 2020년 2월의 주문 수량을 합산.
  • HAVING 조건을 통해 100개 이상의 주문 수량을 가진 제품을 필터링.
  • 상위 쿼리에서 Products 테이블과 연결하여 제품 이름과 주문 수량을 가져옴.

구현 코드

select product_name, unit
from Products,
    (select product_id, sum(unit) unit
    from Orders 
    where month(order_date) = 2 and year(order_date) = 2020
    group by product_id
    having unit >= 100) as id
where Products.product_id = id.product_id

코드 설명

  • 서브쿼리:
    • Orders 테이블에서 2020년 2월에 해당하는 데이터만 필터링하고, product_id별로 주문 수량을 합산하여 100개 이상인 제품만 선택.
      JOIN을 굳이 사용하지 않고도 from절에 복수의 테이블을 넣고 where 조건에서 연결고리를 명시해주면 간단하고 직관적으로 이해가 되는 쿼리를 작성할 수 있다.
  • 메인 쿼리:
    • Products 테이블과 서브쿼리를 쉼표로 나열하여 결합하고, WHERE 절에서 product_id가 일치하는 행을 필터링합니다.

배운 점

  • WHERE 절에서 MONTH()YEAR() 함수를 사용하여 특정 월과 연도를 필터링하는 방법을 학습.
  • HAVING 절을 사용하여 그룹화된 결과에 조건을 적용하는 방법을 익힘.
  • JOIN 없이 서브쿼리를 통해 두 테이블을 결합하는 다양한 접근 방식의 중요성을 이해.

0개의 댓글