-- 1. Приход по филм CREATE VIEW view_movie_revenue AS SELECT m.title, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS total_revenue FROM MOVIE m JOIN SCREENING s ON s.movie_id = m.movie_id JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY m.title ORDER BY total_revenue DESC; -- 2. Најгледан жанр CREATE VIEW view_most_watched_genre AS SELECT g.name AS genre, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS total_revenue FROM GENRE g JOIN MOVIE_GENRE mg ON mg.genre_id = g.genre_id JOIN SCREENING s ON s.movie_id = mg.movie_id JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY g.name ORDER BY total_tickets DESC; -- 3. Најактивни периоди по месец CREATE VIEW view_busiest_months AS SELECT EXTRACT(YEAR FROM s.date)::int AS year, EXTRACT(MONTH FROM s.date)::int AS month, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS total_revenue FROM SCREENING s JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY year, month ORDER BY year, month; -- 4. Приход по кино CREATE VIEW view_cinema_revenue AS SELECT c.name AS cinema, ci.name AS city, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS total_revenue FROM CINEMA c JOIN CITY ci ON ci.city_id = c.city_id JOIN CINEMA_HALL ch ON ch.cinema_id = c.cinema_id JOIN SCREENING s ON s.cinemahall_id = ch.cinemahall_id JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY c.name, ci.name ORDER BY total_revenue DESC; -- 5. Попуненост на сали CREATE VIEW view_hall_occupancy AS SELECT ch.description AS hall, c.name AS cinema, ch.capacity, COUNT(t.ticket_id) AS total_tickets_sold, ROUND((COUNT(t.ticket_id)::numeric / (ch.capacity * COUNT(DISTINCT s.screening_id)) * 100), 2) AS occupancy_percent FROM CINEMA_HALL ch JOIN CINEMA c ON c.cinema_id = ch.cinema_id JOIN SCREENING s ON s.cinemahall_id = ch.cinemahall_id JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY ch.description, c.name, ch.capacity ORDER BY occupancy_percent DESC; -- 6. Најпродавани производи CREATE VIEW view_top_products AS SELECT p.name AS product, p.unit, p.price AS unit_price, SUM(pp.numbers) AS total_quantity_sold, SUM(pp.numbers * p.price) AS total_revenue FROM PRODUCT p JOIN PURCHASED_PRODUCT pp ON pp.product_id = p.product_id GROUP BY p.name, p.unit, p.price ORDER BY total_quantity_sold DESC; -- 7. Промоции vs приход CREATE VIEW view_promotion_impact AS SELECT pr.name AS promotion, pr.discount AS discount_percent, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS revenue_with_promotion, ROUND(AVG(t.price)::numeric, 2) AS avg_ticket_price FROM PROMOTION pr JOIN SCREENING s ON s.screening_id = pr.screening_id JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY pr.name, pr.discount ORDER BY total_tickets DESC; -- 8. Резервации по статус CREATE VIEW view_reservation_status AS SELECT status, COUNT(*) AS total_reservations, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS percentage FROM RESERVATION GROUP BY status ORDER BY total_reservations DESC; -- 9. Популарни термини CREATE VIEW view_popular_time_slots AS SELECT s.time AS time_slot, COUNT(t.ticket_id) AS total_tickets, SUM(t.price) AS total_revenue, ROUND(AVG(t.price)::numeric, 2) AS avg_ticket_price FROM SCREENING s JOIN TICKET t ON t.screening_id = s.screening_id GROUP BY s.time ORDER BY total_tickets DESC;