728x90
< 문제 >
[SQL50] 1251. Average Selling Price (AGGREGATE)
< 풀이 >
SELECT A.product_id,
COALESCE(ROUND(SUM(A.price * B.units) / NULLIF(SUM(B.units), 0)::decimal, 2),0) AS average_price
FROM Prices A LEFT JOIN UnitsSold B ON A.product_id = B.product_id
AND A.start_date <= B.purchase_date
AND B.purchase_date <= A.end_date
GROUP BY A.product_id;
- Prices LEFT JOIN UnitsSold
- Table Prices : 제품 가격 정보 (product_id, price, start_date, end_date) 포함
- Table UnitsSold : 제품 판매 정보 (product_id, purchase_date, units) 포함
- 모든 Prices 데이터가 유지되며, UnitsSold 데이터가 없을 경우 NULL을 반환할 수 있다.
- COALESCE(ROUND(SUM(A.price * B.units) / NULLIF(SUM(B.units), 0)::decimal, 2),0) AS average_price
- SUM(A.price * B.units) : 각 가격별로 판매된 개수를 곱한 값들의 합
- SUM(B.units) : 판매된 개수의 총합
- SUM(A.price * B.units) / (SUM(B.units) : 평균 가격
- NULL 처리
- NULLIF(SUM(B.units), 0) : SUM(B.units)이 0이면 NULL로 변환하여 0으로 나누는 오류 방지
- ROUND(..., 2) : 소수점 2자리로 반올림
- COALESCE(..., 0) : NULL값을 0으로 치환 (판매 기록이 없는 경우 평균 가격을 0으로 설정)
COALESCE
null값 처리
https://youngone-kang.tistory.com/52
ROUND
반올림 처리
https://youngone-kang.tistory.com/51
728x90
'coding_test > SQL 문제' 카테고리의 다른 글
[LeetCode] 1633. Percentage of Users Attended a Contest (AGGREGATE) (0) | 2025.02.10 |
---|---|
[LeetCode] 1075. Project Employees I (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 620. Not Boring Movies (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 1934. Confirmation Rate (JOIN) (0) | 2025.02.08 |
[LeetCode] 570. Managers with at Least 5 Direct Reports (JOIN) (0) | 2025.02.08 |