
문제
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 이후 집계가 잘못되어 평균이 왜곡됨 (실수하지 말자!)
'코딩 테스트 연습 > [프로그래머스][리트코드] MySQL' 카테고리의 다른 글
| 1075. Project Employees I (0) | 2025.10.17 |
|---|---|
| 620. Not Boring Movies (0) | 2025.10.14 |
| 1934. Confirmation Rate (0) | 2025.10.13 |
| -- 9월 프로젝트 집중 기간 -- (0) | 2025.08.31 |
| 570. Managers with at Least 5 Direct Reports (4) | 2025.08.29 |