--Сделать функцию, которая на вход принимает фамилию актера.

--В функции отбираются все фильмы, в которых снимался актер с указанной фамилией. Отобранные фильмы группируются по полю 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');


Last modified: Sunday, 10 July 2022, 5:53 PM