본문 바로가기

Algorithm/SQL

(SQL) - LeetCode (easy) 1251. Average Selling Price

반응형

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

 

Average Selling Price - LeetCode

Can you solve this real interview question? Average Selling Price - Table: Prices +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | start_date | date | | end_date | date | | price | int | +---------------

leetcode.com

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;

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.