Разбор домашнего задания
--Вывести все фильмы без ограничения по возрасту (film.rating = ‘G’). По каждому из фильмов вывести:
--- название (film.title)
--- сколько всего дисков с этим фильмом (кол-во записей в inventory) (рассчитать отдельной функцией, которая принимает на вход film_id)
--- сколько раз фильм сдавали в аренду (кол-во записей в rental) (рассчитать отдельной функцией, которая принимает на вход film_id)
create function disk_nm(film_id integer) returns integer
as $$
select
count(*)
from
inventory i
where
i.film_id = disk_nm.film_id;
$$
language sql;create function rent_nm(film_id integer) returns integer
as $$
select
count(*)
from
inventory i
join rental r using(inventory_id)
where
i.film_id = rent_nm.film_id;
$$ language sql;
select
f.title,
disk_nm(f.film_id) as disk_nm,
rent_nm(f.film_id) as rent_nm
from
film f
where
f.rating = 'G';
--Написать функцию, которая принимает на вход два целых числа типа int и возвращает наибольшее из них.
--Написать запрос с примером использования этой функции.
create function maximum(i1 integer, i2 integer) returns integer
as $$
select
case
when i1 > i2
then i1
else i2
end;
$$ language sql;
select
maximum(1, 2),
maximum(3, 2),
maximum(3, 3)
--Написать функцию, которая добавляет в систему информацию о новом компакт диске (добавляет новую запись в таблицу inventory).
--Принимает параметры:
--- film_id - id фильма, который находится на новом компакт диске
--- store_id - id магазина, к которому будет привязан компакт диск
--Добавить 3 новых компакт диска в систему, используя новую функцию.
drop function create_inventory;
create function create_inventory(film_id integer, store_id integer) returns void
as $$
insert into inventory(
film_id,
store_id
)
values(
film_id,
store_id
);
$$ language sql;
select
create_inventory(1, 1),
create_inventory(100, 2),
create_inventory(200, 1)
select
*
from
inventory
order by inventory_id desc;
--*Написать функцию, которая принимает на вход film_id и возвращает пары значений:
--- дату
--- общую сумму платежей по данному фильму за эту дату (sum(payment.amount))
--
--Выводим только даты, за которые был хотя бы один платеж по выбранному фильму.
--Отсортировать результат в порядке увеличения даты.
create function payment_film_amount(film_id integer) returns table(dt date, amount float)
as $$
select
p.payment_date::date as dt,
sum(p.amount) as amount
from
inventory i
join rental r using(inventory_id)
join payment p using(rental_id)
where
i.film_id = payment_film_amount.film_id
group by
p.payment_date::date
order by
dt;
$$ language sql;
select
*
from
payment_film_amount(3);