| 1 |
|
|---|
| 2 |
|
|---|
| 3 | --VIEW 1 – vw_film_available_showtimes
|
|---|
| 4 | --Го прикажува за секој филм во кои сали и кино се одржуваат проекции со слободни места.
|
|---|
| 5 | -- Може да се користи доколку сакаме за конкретен филм да провериме во која сала и кино се прикажува.
|
|---|
| 6 | CREATE VIEW vw_film_available_showtimes AS
|
|---|
| 7 | SELECT
|
|---|
| 8 | m.movie_id,
|
|---|
| 9 | m.title AS film,
|
|---|
| 10 | m.duration AS trajanje_min,
|
|---|
| 11 | c.name AS kino,
|
|---|
| 12 | c.city AS grad,
|
|---|
| 13 | h.hall_id,
|
|---|
| 14 | h.name AS sala,
|
|---|
| 15 | s.showtime_id,
|
|---|
| 16 | s.start_time,
|
|---|
| 17 | s.end_time,
|
|---|
| 18 | s.base_price,
|
|---|
| 19 | h.capacity AS vkupni_mesta,
|
|---|
| 20 | COUNT(t.ticket_id) AS zafateni_mesta,
|
|---|
| 21 | h.capacity - COUNT(t.ticket_id) AS slobodni_mesta
|
|---|
| 22 | FROM Movie m
|
|---|
| 23 | JOIN Showtime s ON s.movie_id = m.movie_id
|
|---|
| 24 | JOIN Hall h ON h.hall_id = s.hall_id
|
|---|
| 25 | JOIN Cinema c ON c.cinema_id = h.cinema_id
|
|---|
| 26 | LEFT JOIN Ticket t ON t.showtime_id = s.showtime_id
|
|---|
| 27 | GROUP BY
|
|---|
| 28 | m.movie_id, m.title, m.duration,
|
|---|
| 29 | c.name, c.city,
|
|---|
| 30 | h.hall_id, h.name, h.capacity,
|
|---|
| 31 | s.showtime_id, s.start_time, s.end_time, s.base_price
|
|---|
| 32 | HAVING h.capacity - COUNT(t.ticket_id) > 0
|
|---|
| 33 | ORDER BY m.title, s.start_time;
|
|---|
| 34 |
|
|---|
| 35 | --употреба доколку сакаме за конкретен филм да провериме
|
|---|
| 36 | SELECT * FROM vw_film_available_showtimes WHERE film = '3 Idiots';
|
|---|
| 37 |
|
|---|
| 38 |
|
|---|
| 39 | --VIEW 2 – vw_user_reservations
|
|---|
| 40 | --Ги прикажува сите резервации на одреден корисник со детали за филмот, салата, седиштето и плаќањето(историјата на резервации).
|
|---|
| 41 | -- Може да се користи доколку сакаме да ги видиме сите резервации на конкретен корисник по неговиот user_id или емаил
|
|---|
| 42 | CREATE VIEW vw_user_reservations AS
|
|---|
| 43 | SELECT
|
|---|
| 44 | u.user_id,
|
|---|
| 45 | u.first_name || ' ' ||
|
|---|
| 46 | u.last_name AS korisnik,
|
|---|
| 47 | u.email,
|
|---|
| 48 | r.reservation_id,
|
|---|
| 49 | r.reservation_date,
|
|---|
| 50 | r.status AS status_rezervacija,
|
|---|
| 51 | m.title AS film,
|
|---|
| 52 | c.name AS kino,
|
|---|
| 53 | h.name AS sala,
|
|---|
| 54 | s.start_time,
|
|---|
| 55 | s.end_time,
|
|---|
| 56 | se.seat_row AS red,
|
|---|
| 57 | se.seat_number AS broj_sediste,
|
|---|
| 58 | st.type AS tip_sediste,
|
|---|
| 59 | t.price AS cena_bilet,
|
|---|
| 60 | rp.amount AS plateno,
|
|---|
| 61 | rp.payment_method,
|
|---|
| 62 | rp.payment_date
|
|---|
| 63 | FROM CinemaUser u
|
|---|
| 64 | JOIN Reservation r ON r.user_id = u.user_id
|
|---|
| 65 | JOIN Showtime s ON s.showtime_id = r.showtime_id
|
|---|
| 66 | JOIN Movie m ON m.movie_id = s.movie_id
|
|---|
| 67 | JOIN Hall h ON h.hall_id = s.hall_id
|
|---|
| 68 | JOIN Cinema c ON c.cinema_id = h.cinema_id
|
|---|
| 69 | LEFT JOIN Ticket t ON t.reservation_id = r.reservation_id
|
|---|
| 70 | LEFT JOIN Seat se ON se.seat_id = t.seat_id
|
|---|
| 71 | LEFT JOIN Seat_Type st ON st.seat_type_id = se.seat_type_id
|
|---|
| 72 | LEFT JOIN ReservationPayment rp ON rp.reservation_id = r.reservation_id
|
|---|
| 73 | ORDER BY u.user_id, s.start_time;
|
|---|
| 74 | --конкретна употреба на ова view според user_id
|
|---|
| 75 | SELECT * FROM vw_user_reservations WHERE user_id = 42;
|
|---|
| 76 | --или по email:
|
|---|
| 77 | SELECT * FROM vw_user_reservations WHERE email = 'sonja_popova_99996@mail.com';
|
|---|
| 78 |
|
|---|
| 79 |
|
|---|
| 80 | --VIEW 3 – vw_order_details
|
|---|
| 81 | --Ги прикажува деталите на секоја нарачка, вклучувајќи купувач, касиер, производи, количини и цени.
|
|---|
| 82 | -- Може да се користи доколку сакаме да ги видиме сите производи и вкупната цена за конкретна нарачка
|
|---|
| 83 | CREATE VIEW vw_order_details AS
|
|---|
| 84 | SELECT
|
|---|
| 85 | co.order_id,
|
|---|
| 86 | co.order_date,
|
|---|
| 87 | u.user_id,
|
|---|
| 88 | u.first_name || ' ' || u.last_name AS korisnik,
|
|---|
| 89 | u.email,
|
|---|
| 90 | u.phone,
|
|---|
| 91 | e.first_name || ' ' || e.last_name AS kasijer,
|
|---|
| 92 | p.product_id,
|
|---|
| 93 | p.name AS proizvod,
|
|---|
| 94 | op.quantity AS kolicina,
|
|---|
| 95 | op.price_at_order AS cena,
|
|---|
| 96 | (op.quantity * op.price_at_order) AS vkupna_cena_proizvod,
|
|---|
| 97 | co.total_price AS vkupna_cena_naracka
|
|---|
| 98 | FROM CinemaOrder co
|
|---|
| 99 | JOIN CinemaUser u ON u.user_id = co.user_id
|
|---|
| 100 | JOIN Employee e ON e.employee_id = co.employee_id
|
|---|
| 101 | JOIN Order_Product op ON op.order_id = co.order_id
|
|---|
| 102 | JOIN Product p ON p.product_id = op.product_id
|
|---|
| 103 | ORDER BY co.order_id;
|
|---|
| 104 |
|
|---|
| 105 | --конкретна употреба според order_id
|
|---|
| 106 | SELECT * FROM vw_order_details WHERE order_id = 432;
|
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 | --VIEW 4 – vw_cinema_schedule_by_period
|
|---|
| 110 | --Го прикажува распоредот на проекции во одредено кино за зададен временски период со жанрови.
|
|---|
| 111 | --Може да се користи доколку сакаме да видиме кои филмови се прикажуваат во конкретно кино во одреден период
|
|---|
| 112 | CREATE VIEW vw_cinema_schedule_by_period AS
|
|---|
| 113 | SELECT
|
|---|
| 114 | c.cinema_id,
|
|---|
| 115 | c.name AS kino,
|
|---|
| 116 | c.city AS grad,
|
|---|
| 117 | s.start_time::DATE AS datum,
|
|---|
| 118 | TO_CHAR(s.start_time, 'Day') AS den_naziv,
|
|---|
| 119 | m.title AS film,
|
|---|
| 120 | m.duration AS traenje,
|
|---|
| 121 | h.name AS sala,
|
|---|
| 122 | s.start_time,
|
|---|
| 123 | s.end_time,
|
|---|
| 124 | s.base_price AS cena,
|
|---|
| 125 | STRING_AGG(DISTINCT g.name, ', ') AS zanrovi
|
|---|
| 126 | FROM Cinema c
|
|---|
| 127 | JOIN Hall h ON h.cinema_id = c.cinema_id
|
|---|
| 128 | JOIN Showtime s ON s.hall_id = h.hall_id
|
|---|
| 129 | JOIN Movie m ON m.movie_id = s.movie_id
|
|---|
| 130 | LEFT JOIN Genre_Movie gm ON gm.movie_id = m.movie_id
|
|---|
| 131 | LEFT JOIN Genre g ON g.genre_id = gm.genre_id
|
|---|
| 132 | GROUP BY c.cinema_id, c.name, c.city, s.showtime_id, s.start_time, s.end_time,
|
|---|
| 133 | m.movie_id, m.title, m.duration, h.hall_id, h.name, s.base_price
|
|---|
| 134 | ORDER BY c.cinema_id, s.start_time;
|
|---|
| 135 |
|
|---|
| 136 |
|
|---|
| 137 |
|
|---|
| 138 | --VIEW 5 – vw_movie_reviews_summary
|
|---|
| 139 | --Може да се користи доколку сакаме да ја видиме просечната,минималната и максималната оцена и вкупниот број рецензии за конкретен филм.
|
|---|
| 140 | --Исто така од кои жанрови е тој филм
|
|---|
| 141 | CREATE MATERIALIZED VIEW vw_movie_reviews_summary AS
|
|---|
| 142 | SELECT
|
|---|
| 143 | m.movie_id,
|
|---|
| 144 | m.title,
|
|---|
| 145 | m.release_year,
|
|---|
| 146 | m.language,
|
|---|
| 147 | ROUND(AVG(r.rating), 2) AS avg_rating,
|
|---|
| 148 | COUNT(r.review_id) AS total_reviews,
|
|---|
| 149 | MAX(r.rating) AS max_rating,
|
|---|
| 150 | MIN(r.rating) AS min_rating,
|
|---|
| 151 | STRING_AGG(DISTINCT g.name, ', ') AS genres
|
|---|
| 152 | FROM Movie m
|
|---|
| 153 | LEFT JOIN Review r ON r.movie_id = m.movie_id
|
|---|
| 154 | LEFT JOIN Genre_Movie gm ON gm.movie_id = m.movie_id
|
|---|
| 155 | LEFT JOIN Genre g ON g.genre_id = gm.genre_id
|
|---|
| 156 | GROUP BY m.movie_id, m.title, m.release_year, m.language;
|
|---|
| 157 | ----конкретна употреба според movie_id или пак според име на филм
|
|---|
| 158 | SELECT * FROM vw_movie_reviews_summary WHERE movie_id = 1;
|
|---|
| 159 | SELECT * FROM vw_movie_reviews_summary WHERE title = 'Inception';
|
|---|
| 160 |
|
|---|
| 161 |
|
|---|
| 162 | --VIEW 6 – vw_showtime_schedule
|
|---|
| 163 | --Прикажува основни информации за секоја проекција — филм, кино, сала, време, цена и капацитет.
|
|---|
| 164 | --Може да се користи доколку сакаме брзо да ги видиме деталите за конкретна проекција
|
|---|
| 165 | CREATE VIEW vw_showtime_schedule AS
|
|---|
| 166 | SELECT
|
|---|
| 167 | s.showtime_id,
|
|---|
| 168 | m.title AS movie_title,
|
|---|
| 169 | m.duration,
|
|---|
| 170 | c.name AS cinema_name,
|
|---|
| 171 | h.name AS hall_name,
|
|---|
| 172 | s.start_time,
|
|---|
| 173 | s.end_time,
|
|---|
| 174 | s.base_price,
|
|---|
| 175 | h.capacity AS total_seats
|
|---|
| 176 | FROM Showtime s
|
|---|
| 177 | JOIN Movie m ON m.movie_id = s.movie_id
|
|---|
| 178 | JOIN Hall h ON h.hall_id = s.hall_id
|
|---|
| 179 | JOIN Cinema c ON c.cinema_id = h.cinema_id;
|
|---|
| 180 | --конкретна употреба со id на некоја проекција
|
|---|
| 181 | SELECT * FROM vw_showtime_schedule WHERE showtime_id = 3;
|
|---|
| 182 |
|
|---|
| 183 |
|
|---|
| 184 | --VIEW 7 – vw_popular_movies
|
|---|
| 185 | --Ги рангира филмовите според вкупниот број на резервации со додадена просечна оцена од рецензиите.
|
|---|
| 186 | -- Може да се користи доколку сакаме да видиме кои филмови се најпопуларни и најгледани
|
|---|
| 187 | CREATE VIEW vw_popular_movies AS
|
|---|
| 188 | SELECT
|
|---|
| 189 | m.movie_id,
|
|---|
| 190 | m.title,
|
|---|
| 191 | m.release_year,
|
|---|
| 192 | COUNT(r.reservation_id) AS total_reservations,
|
|---|
| 193 | mrs.avg_rating
|
|---|
| 194 | FROM Movie m
|
|---|
| 195 | JOIN Showtime s ON s.movie_id = m.movie_id
|
|---|
| 196 | JOIN Reservation r ON r.showtime_id = s.showtime_id
|
|---|
| 197 | LEFT JOIN vw_movie_reviews_summary mrs ON mrs.movie_id = m.movie_id
|
|---|
| 198 | GROUP BY m.movie_id, m.title, m.release_year, mrs.avg_rating
|
|---|
| 199 | ORDER BY total_reservations DESC;
|
|---|
| 200 |
|
|---|
| 201 |
|
|---|
| 202 |
|
|---|
| 203 | --VIEW 8 – vw_presentation_rights
|
|---|
| 204 | --Прикажува кои кина имаат право да прикажуваат одреден филм и во кој временски период.
|
|---|
| 205 | -- Може да се користи доколку сакаме да провериме кои кина имаат дозвола за прикажување на конкретен филм
|
|---|
| 206 | CREATE VIEW vw_presentation_rights AS
|
|---|
| 207 | SELECT
|
|---|
| 208 | pr.presentationRights_id,
|
|---|
| 209 | m.title AS film,
|
|---|
| 210 | m.release_year,
|
|---|
| 211 | c.name AS kino,
|
|---|
| 212 | c.city AS grad,
|
|---|
| 213 | pr.start_date,
|
|---|
| 214 | pr.end_date
|
|---|
| 215 | FROM PresentationRights pr
|
|---|
| 216 | JOIN Movie m ON m.movie_id = pr.movie_id
|
|---|
| 217 | JOIN Cinema c ON c.cinema_id = pr.cinema_id;
|
|---|
| 218 | -- за конкретен филм кои кина имаат дозвола да го прикажуваат
|
|---|
| 219 | SELECT * FROM vw_presentation_rights WHERE film = 'The Godfather';
|
|---|
| 220 | -- за конкретно кино кои филмови има дозвола да ги прикажува
|
|---|
| 221 | SELECT * FROM vw_presentation_rights WHERE kino = 'CinemaHouse 1';
|
|---|
| 222 |
|
|---|
| 223 |
|
|---|
| 224 | --VIEW 9 – vw_monthly_revenue
|
|---|
| 225 | --Ги прикажува месечните приходи по кино врз основа на извршените плаќања за резервации.
|
|---|
| 226 | --Може да се користи доколку сакаме да ги видиме приходите за конкретно кино во одреден месец:
|
|---|
| 227 | CREATE VIEW vw_monthly_revenue AS
|
|---|
| 228 | SELECT
|
|---|
| 229 | DATE_TRUNC('month', rp.payment_date) AS month,
|
|---|
| 230 | c.name AS cinema_name,
|
|---|
| 231 | SUM(rp.amount) AS revenue,
|
|---|
| 232 | COUNT(rp.payment_id) AS num_payments
|
|---|
| 233 | FROM ReservationPayment rp
|
|---|
| 234 | JOIN Reservation r ON r.reservation_id = rp.reservation_id
|
|---|
| 235 | JOIN Showtime s ON s.showtime_id = r.showtime_id
|
|---|
| 236 | JOIN Hall h ON h.hall_id = s.hall_id
|
|---|
| 237 | JOIN Cinema c ON c.cinema_id = h.cinema_id
|
|---|
| 238 | GROUP BY DATE_TRUNC('month', rp.payment_date), c.name
|
|---|
| 239 | ORDER BY month; |
|---|