| 392 | | LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id; |
| 393 | | |
| 394 | | }}} |
| 395 | | |
| 396 | | === `Event_User_Ratings` |
| 397 | | |
| 398 | | Овој поглед овозможува детален пристап до поединечните коментари и оценки што секој корисник ги оставил за одреден термин на настан. |
| 399 | | |
| 400 | | {{{ |
| 401 | | |
| 402 | | CREATE VIEW "Event_User_Ratings" AS |
| 403 | | SELECT eh.event_happening_id, |
| 404 | | e.event_id, |
| 405 | | e.name AS event_name, |
| 406 | | u.user_id, |
| 407 | | u.username, |
| 408 | | ehr.rating_id, |
| 409 | | ehr.rating, |
| 410 | | ehr.comment |
| 411 | | FROM "Event" e |
| 412 | | JOIN "Event_Happening" eh ON e.event_id = eh.event_id |
| 413 | | JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id |
| 414 | | JOIN "User" u ON ehr.user_id = u.user_id; |
| 415 | | |
| 416 | | }}} |
| 417 | | |
| 418 | | === `Event_Overall_Ratings` |
| 419 | | |
| 420 | | Овој поглед врши статистичка анализа на задоволството на публиката преку пресметување на просечната оцена и вкупниот број на рецензии за секој поединечен настан. |
| 421 | | |
| 422 | | {{{ |
| 423 | | |
| 424 | | CREATE VIEW "Event_Overall_Ratings" AS |
| 425 | | SELECT |
| 426 | | e.event_id, |
| 427 | | e.name AS event_name, |
| 428 | | eh.event_happening_id, |
| 429 | | eh.event_time, |
| 430 | | COUNT(ehr.rating_id) AS total_reviews, |
| 431 | | AVG(ehr.rating) AS average_rating |
| 432 | | FROM "Event" e |
| 433 | | JOIN "Event_Happening" eh ON e.event_id = eh.event_id |
| 434 | | JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id |
| 435 | | GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time; |
| 436 | | |
| 437 | | }}} |
| 438 | | |
| 439 | | === `Event_Financial_Summary` |
| 440 | | |
| 441 | | Овој поглед ги сумира финансиските резултати за секој настан, прикажувајќи го вкупниот број на продадени билети, нето приходот по одбивање на рефундациите и посебно издвоената заработка од административните такси при враќање на влезниците. |
| 442 | | |
| 443 | | {{{ |
| 444 | | |
| 445 | | CREATE VIEW "Event_Financial_Summary" AS |
| 446 | | SELECT |
| 447 | | e.event_id, |
| 448 | | e.name AS event_name, |
| 449 | | eh.event_happening_id, |
| 450 | | eh.event_time, |
| 451 | | COUNT(tp.purchase_id) AS total_tickets_sold, |
| 452 | | |
| 453 | | -- total revenue |
| 454 | | SUM(tp.purchase_amount) - SUM(CASE WHEN tr.refund_amount IS NOT NULL THEN tr.refund_amount ELSE 0 END) AS net_revenue, |
| 455 | | |
| 456 | | -- refund taxes |
| 457 | | SUM(CASE WHEN tr.refund_id IS NOT NULL THEN tp.purchase_amount - tr.refund_amount ELSE 0 END) AS refund_tax_profit |
| 458 | | |
| 459 | | FROM "Event" e |
| 460 | | JOIN "Event_Happening" eh ON e.event_id = eh.event_id |
| 461 | | JOIN "Ticket" t ON eh.event_happening_id = t.event_happening_id |
| 462 | | JOIN "Ticket_Purchase" tp ON t.ticket_id = tp.ticket_id |
| 463 | | LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id |
| 464 | | GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time; |
| | 378 | LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id |
| | 379 | LEFT JOIN "Ticket_Refund" tr ON tri.refund_id = tr.refund_id; |
| | 439 | |
| | 440 | === `Event_Overall_Ratings` |
| | 441 | |
| | 442 | Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции (COUNT и AVG), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата. |
| | 443 | |
| | 444 | {{{ |
| | 445 | |
| | 446 | CREATE MATERIALIZED VIEW "Event_Overall_Ratings" AS |
| | 447 | SELECT |
| | 448 | e.event_id, |
| | 449 | e.name AS event_name, |
| | 450 | eh.event_happening_id, |
| | 451 | eh.event_time, |
| | 452 | COUNT(ehr.rating_id) AS total_reviews, |
| | 453 | ROUND(AVG(ehr.rating), 2) AS average_rating |
| | 454 | FROM "Event" e |
| | 455 | JOIN "Event_Happening" eh ON e.event_id = eh.event_id |
| | 456 | JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id |
| | 457 | GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time; |
| | 458 | |
| | 459 | }}} |
| | 460 | |
| | 461 | === `User_Order_History` |
| | 462 | |
| | 463 | Овој материјализиран поглед генерира финансиски профил и историја на нарачки за секој корисник, сумирајќи ги направените трошоци на ниво на главна нарачка. Тој нуди брз увид во точниот број на купени ставки, бројот на рефундирани билети како и вкупната сума на вратени пари по нарачка без оптоварување на трансакциските табели. |
| | 464 | |
| | 465 | {{{ |
| | 466 | |
| | 467 | CREATE MATERIALIZED VIEW "User_Order_History" AS |
| | 468 | SELECT u.user_id, |
| | 469 | u.username, |
| | 470 | o.order_id, |
| | 471 | o.order_time, |
| | 472 | o.order_amount, |
| | 473 | COALESCE(items.total_items_ordered, 0) AS total_items_ordered, |
| | 474 | COALESCE(items.total_items_refunded, 0) AS total_items_refunded, |
| | 475 | COALESCE(items.total_amount_refunded, 0.00) AS total_amount_refunded |
| | 476 | FROM "User" u |
| | 477 | JOIN "Regular_User" ru ON u.user_id = ru.user_id |
| | 478 | JOIN "Ticket_Order" o ON ru.user_id = o.user_id |
| | 479 | LEFT JOIN ( |
| | 480 | SELECT |
| | 481 | toi.order_id, |
| | 482 | COUNT(toi.order_item_id) AS total_items_ordered, |
| | 483 | COUNT(tri.refund_item_id) AS total_items_refunded, |
| | 484 | SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded |
| | 485 | FROM "Ticket_Order_Item" toi |
| | 486 | LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id |
| | 487 | GROUP BY toi.order_id |
| | 488 | ) items ON o.order_id = items.order_id; |
| | 489 | |
| | 490 | }}} |
| | 491 | |
| | 492 | === `Venue_Occupancy_Report` |
| | 493 | |
| | 494 | Овој комплексен аналитички поглед ја мери успешноста на продажбата преку споредба на бројот на продадени карти со максималниот капацитет на седишта во салата. Крајниот резултат дава прецизен процент на пополнетост за секој термин на настан, што е клучен бизнис индикатор за менаџерите и организаторите. |
| | 495 | |
| | 496 | {{{ |
| | 497 | |
| | 498 | CREATE MATERIALIZED VIEW "Venue_Occupancy_Report" AS |
| | 499 | SELECT e.event_id, |
| | 500 | e.name AS event_name, |
| | 501 | eh.event_happening_id, |
| | 502 | eh.event_time, |
| | 503 | v.name AS venue_name, |
| | 504 | v.number_of_seats AS total_venue_capacity, |
| | 505 | COALESCE(stats.sold_count, 0) AS tickets_sold, |
| | 506 | ROUND((COALESCE(stats.sold_count, 0)::NUMERIC / v.number_of_seats::NUMERIC) * 100, 2) AS occupancy_percentage |
| | 507 | FROM "Event" e |
| | 508 | JOIN "Event_Happening" eh ON e.event_id = eh.event_id |
| | 509 | JOIN "Venue" v ON eh.venue_id = v.venue_id |
| | 510 | LEFT JOIN ( |
| | 511 | SELECT t.event_happening_id, COUNT(toi.order_item_id) AS sold_count |
| | 512 | FROM "Ticket_Order_Item" toi |
| | 513 | JOIN "Ticket" t ON toi.ticket_id = t.ticket_id |
| | 514 | GROUP BY t.event_happening_id |
| | 515 | ) stats ON eh.event_happening_id = stats.event_happening_id |
| | 516 | GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time, v.name, v.number_of_seats, stats.sold_count; |
| | 517 | |
| | 518 | }}} |