반응형
https://leetcode.com/problems/average-selling-price/description/
case, join, group by를 사용해 본 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
price와 unitsold를 left outer join을 한 뒤 prices.start_date와 end_date 사이에 팔린 unitsold.purchase_date에 해당하는 행을 골라 단위 * 개당 가격 / 팔린 전체 개수의 평균을 구해줍니다.* divide by zero를 주의해서 팔린 전체 개수가 0인 경우와 null인 경우 0으로 average_price를 select해줍니다.
📕 Code
📔 MySQL, Oracle
SELECT
p.product_id,
CASE
WHEN SUM(u.units) = 0 OR SUM(u.units) IS NULL THEN 0
ELSE ROUND(SUM(p.price * u.units) / SUM(u.units), 2)
END AS average_price
FROM prices p
LEFT OUTER 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;
📔 PostgreSQL
기본적으로 integer로 계산되므로 DECIMAL로 type casting해준 값으로 나눠 소수점이 버려지지 않도록 해줍니다.
SELECT
p.product_id,
CASE
WHEN SUM(u.units) = 0 OR SUM(u.units) IS NULL THEN 0
ELSE ROUND(SUM(p.price * u.units) / SUM(u.units)::DECIMAL, 2)
END AS average_price
FROM prices p
LEFT OUTER 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;
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.
'Algorithm > SQL' 카테고리의 다른 글
(SQL) - LeetCode (easy) 1507. Reformat Date (0) | 2024.04.13 |
---|---|
(SQL) - LeetCode (easy) 1484. Group Sold Products By The Date (0) | 2024.04.02 |
(SQL) - LeetCode (easy) 1211. Queries Quality and Percentage (2) | 2023.12.06 |
(SQL) - LeetCode (easy) 1148. Article Views I (0) | 2023.11.09 |
(SQL) - LeetCode (easy) 1141. User Activity for the Past 30 Days I (0) | 2023.11.07 |