Разбор домашнего задания
--Сделать функцию, которая на вход принимает фамилию актера.
--В функции отбираются все фильмы, в которых снимался актер с указанной фамилией. Отобранные фильмы группируются по полю film.rating.
--Для каждого рейтинга отобразить поля:
--- Сколько всего отобранных фильмов с таким рейтингом.
--- Какая средняя выручка на один фильм.
--- Сколько дисков в среднем на один фильм.
create or replace function film_details_by_actor(actor_last_name varchar(45))
returns table (
rating mpaa_rating,
film_nm integer,
amount_avg_per_film float,
disk_avg_per_film float
)
as $$
begin
create temporary table film_with_actor on commit drop as
select
f.film_id,
f.rating
from
film f
join film_actor using (film_id)
join actor using (actor_id)
where
actor.last_name = film_details_by_actor.actor_last_name;
create temporary table film_nm_by_rating on commit drop as
select
f.rating,
count(f.film_id) as film_nm
from
film_with_actor f
group by
f.rating;
create temporary table amount_and_disk_nm_per_rating on commit drop as
select
fa.rating,
sum(p.amount) as total_amount,
count(distinct i.inventory_id) as total_disk
from
film_with_actor fa
join inventory i using (film_id)
left join rental r using (inventory_id)
left join payment p using (rental_id)
group by
fa.rating;
return query
select
fr.rating,
fr.film_nm::integer,
cast(ar.total_amount / fr.film_nm as float) as amount_avg_per_film,
cast(ar.total_disk / fr.film_nm as float) as disk_avg_per_film
from
film_nm_by_rating fr
left join amount_and_disk_nm_per_rating ar using (rating);
end;
$$
language plpgsql;select * from actor a;
select
*
from
film_details_by_actor('Guiness');