데이터로그😎

[solvesql] 매출이 높은 배우 찾기: 효율적인 쿼리 짜기 ⭐ 본문

# 1. 언어/# 1.1. SQL

[solvesql] 매출이 높은 배우 찾기: 효율적인 쿼리 짜기 ⭐

지지킴 2025. 12. 19. 12:55

*외부 사이트에 문제 게시를 금하기 때문에 풀이법만 기록함.

  • 문제 요약: DVD 대여점에서 대여 매출이 높았던 상위 5명의 배우 추출하기. --> 배우별 대여매출을 구해야한다.
  • 테이블 정보:
    테이블 컬럼 (중요부분만 기재하겠음)
    actor actor_id, first_name, last_name
    film_actor film_id, actor_id
    rental rental_id, inventory_id 
    payment payment_id, rental_id, amount
    inventory inventory_id, film_id
actor ──< film_actor ──< inventory ──< rental ──< payment
      1:N            1:N           1:N        1:N
      
☑️actor(actor_id) = film_actor(actor_id) 
☑️rental(rental_id) = payment(rental_id) 
☑️rental(inventory_id) = inventory(inventory_id)
☑️film_actor(film_id) = inventory(film_id)



  • 풀이법: 테이블 정보를 보니 배우별 대여매출을 구하기 위해선 다음과 같은 루트를 거쳐야 한다. 
    • 테이블 크기를 보니 actor < film < rental 순으로 흘러간다. 따라서 rental -> film -> actor 정보 순으로 join이 필요하다.
    • 1) 대여매출: rental<->payment
    • 2) 영화별 매출: inventory <->대여매출
    • 배우별 대여매출: 
      • 3) 배우별 출연영화: actor <-> film_actor
        4) 배우별 대여매출: 배우별 출연영화 <-> 영화별 매출대여매출: rental<->payment
    • *제일 row 수가 많은, 정보가 많은 payment, rental 단계에서 group by 를 먼저해 영화별 매출을 구하는 것이 좋다.
      이 단계에서 group by를 하지 않은 채 actor, film_actor와 join을 할 경우, 모든 payment record가 actor와 film_actor 에 붙어, row가 폭증하게 된다)
with pay_rent as (
  select i.film_id, sum(p.amount) as revenue
  from rental r
  join payment p on r.rental_id = p.rental_id -- 🔥1)대여매출
  join inventory i on r.inventory_id = i.inventory_id -- 🔥2)영화별 대여매출
  group by 1 -- ⭐row가 많은 payment 쪽에서 먼저 group by 
)

  select first_name, last_name, sum(revenue) as total_revenue
  from actor a 
  join film_actor f on f.actor_id = a.actor_id -- 🔥3)배우별 출연영화 
  join pay_rent p on f.film_id = p.film_id --🔥4)배우별 대여매출
  group by a.actor_id, first_name, last_name
  order by 3 desc
  limit 5

 

 

 


https://solvesql.com/problems/top-revenue-actors/

 

https://solvesql.com/problems/top-revenue-actors/

 

solvesql.com