| 239 | |
| 240 | === Годишен извештај за резервации по пакет |
| 241 | Прикажува број на резервации по пакет месечно низ годината и вкупен приход, за да се согледа кои пакети се најпопуларни и најисплатливи. |
| 242 | {{{ |
| 243 | CREATE OR REPLACE FUNCTION GetMonthlyPackageReport(year INT) |
| 244 | RETURNS TABLE( |
| 245 | Month INT, |
| 246 | PackageName varchar(100), |
| 247 | ReservationCount bigint, |
| 248 | TotalRevenue numeric |
| 249 | ) |
| 250 | LANGUAGE plpgsql |
| 251 | AS $$ |
| 252 | BEGIN |
| 253 | RETURN QUERY |
| 254 | SELECT |
| 255 | EXTRACT(MONTH FROM r.time_point)::INT AS Month, |
| 256 | p.package_name, |
| 257 | COUNT(pr.id_reservation) AS ReservationCount, |
| 258 | SUM(p.price) AS TotalRevenue |
| 259 | FROM travel_sage.package p |
| 260 | JOIN travel_sage.package_reservation pr ON p.id_package = pr.id_package |
| 261 | JOIN travel_sage.reservation r ON pr.id_reservation = r.id_reservation |
| 262 | WHERE EXTRACT(YEAR FROM r.time_point) = year |
| 263 | GROUP BY Month, p.package_name |
| 264 | ORDER BY Month, TotalRevenue DESC; |
| 265 | END; |
| 266 | $$; |
| 267 | }}} |
| 268 | |
| 269 | === Извештај за просечен број активности по дестинација |
| 270 | Прикажува колку активности има по дестинација во просек, со можност да се сортира според најпопуларни дестинации. |
| 271 | {{{ |
| 272 | CREATE OR REPLACE FUNCTION GetAverageActivitiesPerDestination() |
| 273 | RETURNS TABLE( |
| 274 | DestinationName varchar(100), |
| 275 | TotalActivities bigint, |
| 276 | AverageActivitiesPerDestination numeric |
| 277 | ) |
| 278 | LANGUAGE plpgsql |
| 279 | AS $$ |
| 280 | BEGIN |
| 281 | RETURN QUERY |
| 282 | SELECT |
| 283 | d.location_name AS DestinationName, |
| 284 | COUNT(a.id_activity) AS TotalActivities, |
| 285 | ROUND(COUNT(a.id_activity)::numeric / COUNT(DISTINCT d.id_destination),2) AS AverageActivitiesPerDestination |
| 286 | FROM travel_sage.destination d |
| 287 | LEFT JOIN travel_sage.activity a ON d.id_destination = a.id_destination |
| 288 | GROUP BY d.location_name |
| 289 | ORDER BY TotalActivities DESC; |
| 290 | END; |
| 291 | $$; |
| 292 | }}} |
| 293 | |
| 294 | === Извештај за дестинации со најголем процент на евтини активности |
| 295 | Прикажува процент на активности по дестинација кои се евтини (<20), агрегирано, за да се препорачаат буџетски дестинации. |
| 296 | {{{ |
| 297 | CREATE OR REPLACE FUNCTION GetDestinationsCheapActivitiesReport() |
| 298 | RETURNS TABLE( |
| 299 | DestinationName varchar(100), |
| 300 | TotalActivities bigint, |
| 301 | CheapActivities bigint, |
| 302 | PercentCheapActivities numeric |
| 303 | ) |
| 304 | LANGUAGE plpgsql |
| 305 | AS $$ |
| 306 | BEGIN |
| 307 | RETURN QUERY |
| 308 | SELECT |
| 309 | d.location_name AS DestinationName, |
| 310 | COUNT(a.id_activity) AS TotalActivities, |
| 311 | SUM(CASE WHEN a.amount < 20 THEN 1 ELSE 0 END) AS CheapActivities, |
| 312 | ROUND(SUM(CASE WHEN a.amount < 20 THEN 1 ELSE 0 END) * 100.0 / COUNT(a.id_activity),2) AS PercentCheapActivities |
| 313 | FROM travel_sage.destination d |
| 314 | LEFT JOIN travel_sage.activity a ON d.id_destination = a.id_destination |
| 315 | GROUP BY d.location_name |
| 316 | HAVING COUNT(a.id_activity) > 0 |
| 317 | ORDER BY PercentCheapActivities DESC; |
| 318 | END; |
| 319 | $$; |
| 320 | }}} |
| 321 | |
| 322 | === Годишен извештај за активностите по месец |
| 323 | Прикажува колку активности се резервирани по месец во текот на целата година, без да се гледа по корисник или пакет, за да се согледа целокупната популарност на активностите. |
| 324 | {{{ |
| 325 | CREATE OR REPLACE FUNCTION GetMonthlyActivityReport(year INT) |
| 326 | RETURNS TABLE( |
| 327 | Month INT, |
| 328 | TotalActivityReservations bigint |
| 329 | ) |
| 330 | LANGUAGE plpgsql |
| 331 | AS $$ |
| 332 | BEGIN |
| 333 | RETURN QUERY |
| 334 | SELECT |
| 335 | EXTRACT(MONTH FROM r.time_point)::INT AS Month, |
| 336 | COUNT(DISTINCT ar.id_activity) AS TotalActivityReservations |
| 337 | FROM travel_sage.reservation r |
| 338 | JOIN travel_sage.activity_reservation ar ON r.id_reservation = ar.id_reservation |
| 339 | WHERE EXTRACT(YEAR FROM r.time_point) = year |
| 340 | GROUP BY Month |
| 341 | ORDER BY Month; |
| 342 | END; |
| 343 | $$; |
| 344 | }}} |
| 345 | |
| 346 | === Годишен извештај за нови корисници и резервации по месец |
| 347 | Агрегира број на нови корисници и број на резервации месечно за целата година. Дава целосен увид во растот на платформата. |
| 348 | {{{ |
| 349 | CREATE OR REPLACE FUNCTION GetMonthlyUserReservationReport(year INT) |
| 350 | RETURNS TABLE( |
| 351 | Month INT, |
| 352 | NewUsers bigint, |
| 353 | TotalReservations bigint |
| 354 | ) |
| 355 | LANGUAGE plpgsql |
| 356 | AS $$ |
| 357 | BEGIN |
| 358 | RETURN QUERY |
| 359 | SELECT |
| 360 | m.Month, |
| 361 | COUNT(DISTINCT u.id_user) AS NewUsers, |
| 362 | COALESCE(SUM(r.ReservationCount),0) AS TotalReservations |
| 363 | FROM ( |
| 364 | SELECT EXTRACT(MONTH FROM birth_date)::INT AS Month, id_user |
| 365 | FROM travel_sage.users |
| 366 | WHERE EXTRACT(YEAR FROM birth_date) = year |
| 367 | ) u |
| 368 | LEFT JOIN ( |
| 369 | SELECT EXTRACT(MONTH FROM time_point)::INT AS Month, id_reservation, |
| 370 | id_user, COUNT(*) AS ReservationCount |
| 371 | FROM travel_sage.reservation |
| 372 | WHERE EXTRACT(YEAR FROM time_point) = year |
| 373 | GROUP BY Month, id_reservation, id_user |
| 374 | ) r ON u.id_user = r.id_user AND u.Month = r.Month |
| 375 | RIGHT JOIN (SELECT generate_series(1,12) AS Month) m ON m.Month = u.Month OR m.Month = r.Month |
| 376 | GROUP BY m.Month |
| 377 | ORDER BY m.Month; |
| 378 | END; |
| 379 | $$; |
| 380 | }}} |
| 381 | |