코딩 테스트 연습/[프로그래머스][리트코드] MySQL

1251. Average Selling Price

duswjd_data 2025. 10. 16. 09:27

문제

https://leetcode.com/problems/average-selling-price/description/


문제 설명

 

요구사항: 각 제품별 평균 판매 단가 계산

  • 평균 판매 단가 = (price × units) 총합 ÷ 총 판매 수량
  • 소수점 둘째 자리까지 반올림
  • 판매 기록이 없으면 평균 판매가 0으로 처리

정답 코드

SELECT p.product_id,
       IFNULL(ROUND(SUM(u.units*p.price)/SUM(u.units),2),0) AS average_price
FROM prices p
    LEFT JOIN unitssold u ON p.product_id = u.product_id
    AND u.purchase_date BETWEEN p.start_date AND p.end_date
GROUP BY p.product_id

코드 설명

 

  • 판매 기록이 없을 수도 있음
    • Prices를 기준으로 LEFT JOIN 해야 모든 제품 포함
  • 날짜 조건 조인
    • purchase_date BETWEEN start_date AND end_date
    • 해당 판매 기록이 어느 가격 기간에 속하는지 확인
  • 평균 계산
    • SUM(u.units * p.price) / SUM(u.units)
    • 판매 기록 없으면 NULL → IFNULL(..., 0)로 처리
  • 반올림 처리
    • ROUND(..., 2) → 소수점 둘째 자리까지

 


첫 번째 시도 (실패)

SELECT p.product_id,
       IFNULL(ROUND((u.units*p.price)/SUM(u.units),2),0) AS average_price
FROM prices p
    LEFT JOIN unitssold u ON p.product_id = u.product_id
    AND u.purchase_date BETWEEN p.start_date AND p.end_date
GROUP BY p.product_id

틀린 이유

  • (u.units * p.price) / SUM(u.units)
    • 한 행의 가격 × 수량을 전체 합계(SUM(u.units))로 나누는 형태
    • 즉, 그룹 전체 평균이 아니라 각 행 단위 비율을 먼저 계산
      → GROUP BY 이후 집계가 잘못되어 평균이 왜곡됨 (실수하지 말자!)