[LeetCode-SQL 50] 1251. Average Selling Price

코린이·2025년 6월 2일

SQL 문제 풀이 (MySQL)

목록 보기
62/96

❓ 문제

Prices
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| start_date    | date    |
| end_date      | date    |
| price         | int     |
+---------------+---------+

(product_id, start_date, end_date)는 이 테이블의 기본 키(고유 값을 가진 열의 조합)입니다.
이 테이블의 각 행은 start_date에서 end_date까지의 기간에 해당하는 product_id의 가격을 나타냅니다.
각 product_id에는 겹치는 기간이 두 개가 없습니다. 즉, 동일한 product_id에 대해 교차하는 두 개의 기간이 없습니다.

UnitsSold
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| purchase_date | date    |
| units         | int     |
+---------------+---------+

이 테이블에는 중복 행이 포함될 수 있습니다.
이 테이블의 각 행은 판매된 각 제품의 날짜, 단위 및 product_id를 나타냅니다.

각 제품의 평균 판매 가격을 구하는 솔루션을 작성합니다. 평균 가격은 소수점 둘째 자리에서 반올림해야 합니다. 제품에 판매된 단위가 없는 경우 평균 판매 가격은 0으로 가정합니다.

결과 테이블은 임의의 순서로 반환합니다.

자세한 문제 내용은 사이트 참고...


❗️ 문제 풀이

WITH TMP_TB AS (
    SELECT
        A.product_id
        ,SUM(B.units) AS total_units
    FROM Prices A JOIN UnitsSold B
        ON A.product_id = B.product_id
        AND B.purchase_date BETWEEN A.start_date AND A.end_date
    GROUP BY A.product_id
)
SELECT
    A.product_id
    , IFNULL(ROUND(SUM(A.price * B.units / C.total_units),2), 0) AS average_price
FROM Prices A LEFT JOIN UnitsSold B
        ON A.product_id = B.product_id
        AND B.purchase_date BETWEEN A.start_date AND A.end_date
    LEFT JOIN TMP_TB C
        ON A.product_id = C.product_id
GROUP BY A.product_id
;



-- 다른 풀이
SELECT
    A.product_id
    , IFNULL(ROUND(SUM(A.price * B.units) / SUM(B.units),2), 0) AS average_price
FROM Prices A LEFT JOIN UnitsSold B
        ON A.product_id = B.product_id
        AND B.purchase_date BETWEEN A.start_date AND A.end_date
GROUP BY A.product_id
;

🔗 Reference

https://leetcode.com/problems/average-selling-price/description/?envType=study-plan-v2&envId=top-sql-50

0개의 댓글