[Leetcode]1251. Average Selling Price

Sooin Yoon·2025년 4월 18일

Leetcode 문제 : 링크텍스트

헷갈리는 부분

SELECT *
FROM Prices p
JOIN UnitsSold u ON p.product_id = u.product_id 
WHERE u.purchase_date BETWEEN p.start_date AND p.end_date
AND u.purchase_date BETWEEN p.start_date AND p.end_date

일단 문제가 purchase_date가 언제 일어났는지를 확인해서 Prices table에 id확인하고 붙여야 되는데 그 때 쓰는 코드를 WHERE를 써야할지, AND를 써야할지 헷갈림

일단, JOIN ON다음에 ON은 올수 없다!

  1. ON절에 조건을 넣은 경우
SELECT *
FROM Prices p
JOIN UnitsSold u ON p.product_id = u.product_id 
AND u.purchase_date BETWEEN p.start_date AND p.end_date

AND

  • join 조건이 엄격하게 걸려서, 해당 조건에 맞는 UnitsSold만 붙음
  • "모든 상품 가격을 기준으로, 해당 기간에 팔린 경우만 매칭"이라는 명확한 의도 표현
  1. WHERE 절에 조건을을 넣는 경우
SELECT *
FROM Prices p
JOIN UnitsSold u ON p.product_id = u.product_id 
WHERE u.purchase_date BETWEEN p.start_date AND p.end_date

WHERE

  • 사실상 inner join 효과
  • 판매 내역이 없는 상품은 결과에서 빠짐

결론!

  • 판매 여부와 상관없이 모든 상품을 보여준다면 LEFT JOIN .... ON ... AND
  • 판매가 일어나 경우만 보고 싶다면 INNER JOIN .... ON 또는 LEFT JOIN + WHERE.... IS NOT NULL

정답!

SELECT p.product_id, round(sum(p.price * u.units)/sum(units), 2) AS average_price
FROM Prices p
JOIN UnitsSold u ON p.product_id = u.product_id 
WHERE u.purchase_date BETWEEN p.start_date AND p.end_date
GROUP BY p.product_id

0개의 댓글