| | 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 | |