본문 바로가기

코딩일기

SQL 코드카타 101 - Product Sales Analysis III

https://leetcode.com/problems/product-sales-analysis-iii/description/

 

Column Name Type 
sale_id int
product_id int
year int
quantity int
price int

Sales 테이블:

  • sale_id (int): 판매 ID
  • product_id (int): 제품 ID (Product 테이블의 외래 키)
  • year (int): 판매 연도
  • quantity (int): 판매 수량
  • price (int): 단위 가격
Column Name Type
product_id int
product_name varchar

Product 테이블:

  • product_id (int): 제품 ID
  • product_name (varchar): 제품 이름

Sales 테이블에서 각 제품(product_id)의 첫 번째 판매 연도(year)에 해당하는 제품 ID, 연도, 수량, 가격을 선택하는 SQL 쿼리를 작성하세요. 결과는 아무 순서로나 반환해도 됩니다.

 

오늘의 sql코드카타, 제품 id별로 최소년도(첫 판매년도)의 id, 연도, 수량, 가격을 출력하면 된다. 솔직히 말해서 딱 봤을때 쉬워보였다. 그런데 문제가 있었다. 예시는 분명 올바르게 출력이 되었는데 실제로 제출을 하니 결과가 맞지 않았다.

select
    s.product_id,
    fy.first_year,
    s.quantity,
    s.price
from Sales s join
(
select
    product_id,
    min(year) first_year
from Sales
group by product_id
) fy on s.product_id = fy.product_id
group by s.product_id

처음으로 작성했던 코드

 

출력결과를 살펴보니 출력값의 년도에 대한 데이터가 일치되지 않은 것을 확인할 수 있었다. 코드를 다시 살펴보니 내가 잘못 생각한 부분이 있었다. 메인쿼리에 작성한 group by s.product_id가 바로 그 부분인데 내 목적은 첫 년도에 해당하는 데이터만 출력하려고 한 것이지만 필터링을 이렇게 하면 나머지 데이터들이 제대로 출력이 안되기 때문이다.

 

대신에 join에 조건을 추가해서 판매년도와 첫 판매년도가 일치하는 열만 출력하도록 하자.

select
    s.product_id,
    fy.first_year,
    s.quantity,
    s.price
from Sales s join
(
select
    product_id,
    min(year) first_year
from Sales
group by product_id
) fy on s.product_id = fy.product_id and
fy.first_year = s.year

 

작성완료!