SQL/문제

SQL | Average Selling Price, Percentage of Users Attended a Contest

jjangdoll 2025. 1. 6. 10:24

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


Average Selling Price

-- 제품별 평균 판매 가격, 소수점 둘째 자리까지 반올림
-- 단위가 없는 경우 0으로 처리
SELECT
    p.product_id,
    CASE WHEN 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 JOIN UnitsSold u 
        ON u.product_id = p.product_id
        AND u.purchase_date >= p.start_date 
        AND u.purchase_date <=p.end_date -- on에 조건 여러개 가능
GROUP BY 1 ;

💡 on에 조건 여러개 가능


https://leetcode.com/problems/percentage-of-users-attended-a-contest/description/


Percentage of Users Attended a Contest

-- 대회 등록한 사람 비율 소수점 둘째 자리까지 
-- 비율 기준 내림차순, 대회 아이디 기준 오름차순
WITH a AS(
    SELECT
        r.contest_id,
        u.user_id,
        COUNT(*) cnt_contest
    FROM
        Register r LEFT JOIN Users u ON r.user_id = u.user_id
    GROUP BY 1),	-- 대회 등록한 사람수 
b AS(
    SELECT 
        count(*) AS cnt
    FROM
        Users)		-- 전체 사람수
SELECT 
    a.contest_id,
    ROUND(a.cnt_contest / b.cnt *100,2) AS percentage
FROM
    b CROSS JOIN a	-- 크로스 조인써서 전체 사람수를 모든 곳에 뿌림
ORDER BY 2 DESC , 1 ;

- 이 방법보다 더 간단한 방법이 있을 것 같은데 한 번 고민해봐야겠음