Changes between Version 14 and Version 15 of AdvancedReports


Ignore:
Timestamp:
09/25/25 00:55:58 (3 weeks ago)
Author:
223270
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v14 v15  
    237237}}}
    238238
     239
     240=== Годишен извештај за резервации по пакет
     241Прикажува број на резервации по пакет месечно низ годината и вкупен приход, за да се согледа кои пакети се најпопуларни и најисплатливи.
     242{{{
     243CREATE OR REPLACE FUNCTION GetMonthlyPackageReport(year INT)
     244RETURNS TABLE(
     245    Month INT,
     246    PackageName varchar(100),
     247    ReservationCount bigint,
     248    TotalRevenue numeric
     249)
     250LANGUAGE plpgsql
     251AS $$
     252BEGIN
     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;
     265END;
     266$$;
     267}}}
     268
     269=== Извештај за просечен број активности по дестинација
     270Прикажува колку активности има по дестинација во просек, со можност да се сортира според најпопуларни дестинации.
     271{{{
     272CREATE OR REPLACE FUNCTION GetAverageActivitiesPerDestination()
     273RETURNS TABLE(
     274    DestinationName varchar(100),
     275    TotalActivities bigint,
     276    AverageActivitiesPerDestination numeric
     277)
     278LANGUAGE plpgsql
     279AS $$
     280BEGIN
     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;
     290END;
     291$$;
     292}}}
     293
     294=== Извештај за дестинации со најголем процент на евтини активности
     295Прикажува процент на активности по дестинација кои се евтини (<20), агрегирано, за да се препорачаат буџетски дестинации.
     296{{{
     297CREATE OR REPLACE FUNCTION GetDestinationsCheapActivitiesReport()
     298RETURNS TABLE(
     299    DestinationName varchar(100),
     300    TotalActivities bigint,
     301    CheapActivities bigint,
     302    PercentCheapActivities numeric
     303)
     304LANGUAGE plpgsql
     305AS $$
     306BEGIN
     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;
     318END;
     319$$;
     320}}}
     321
     322=== Годишен извештај за активностите по месец
     323Прикажува колку активности се резервирани по месец во текот на целата година, без да се гледа по корисник или пакет, за да се согледа целокупната популарност на активностите.
     324{{{
     325CREATE OR REPLACE FUNCTION GetMonthlyActivityReport(year INT)
     326RETURNS TABLE(
     327    Month INT,
     328    TotalActivityReservations bigint
     329)
     330LANGUAGE plpgsql
     331AS $$
     332BEGIN
     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;
     342END;
     343$$;
     344}}}
     345
     346=== Годишен извештај за нови корисници и резервации по месец
     347Агрегира број на нови корисници и број на резервации месечно за целата година. Дава целосен увид во растот на платформата.
     348{{{
     349CREATE OR REPLACE FUNCTION GetMonthlyUserReservationReport(year INT)
     350RETURNS TABLE(
     351    Month INT,
     352    NewUsers bigint,
     353    TotalReservations bigint
     354)
     355LANGUAGE plpgsql
     356AS $$
     357BEGIN
     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;
     378END;
     379$$;
     380}}}
     381
    239382=== Дестинации со најголем број на разновидни настани
    240383Идентификување на дестинации со најголем број на различни видови на настани (концерти, фестивали, саеми и сл.).