Changes between Version 6 and Version 7 of AnalyticalStatisticalQuerying


Ignore:
Timestamp:
09/27/25 13:25:45 (2 weeks ago)
Author:
221507
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AnalyticalStatisticalQuerying

    v6 v7  
    4343
    4444{{{
    45 WITH company_performance AS (
    46     SELECT
    47         to_org.company_name,
    48         COUNT(DISTINCT r.route_id) as routes_operated,
    49         COUNT(DISTINCT t.trip_id) as trips_organized,
    50         COUNT(tk.ticket_id) as total_tickets_sold,
    51         SUM(COALESCE(tk.price, 0)) as total_revenue,
    52         AVG(COALESCE(tk.price, 0)) as avg_ticket_price,
    53         COUNT(DISTINCT tk.account_id) as unique_customers,
    54         AVG(COALESCE(rev.rating, 0)) as avg_rating
    55     FROM transport_organizer to_org
    56     JOIN route r ON to_org.transport_organizer_id = r.transport_organizer_id
    57     JOIN trip t ON r.route_id = t.route_id
    58     LEFT JOIN ticket tk ON t.trip_id = tk.trip_id
    59     LEFT JOIN review rev ON tk.ticket_id = rev.ticket_id
    60     GROUP BY to_org.transport_organizer_id, to_org.company_name
    61 )
    62 SELECT
    63     company_name,
    64     routes_operated,
    65     trips_organized,
    66     total_tickets_sold,
    67     total_revenue,
    68     avg_ticket_price,
    69     unique_customers,
    70     ROUND(avg_rating, 2) as avg_rating
    71 FROM company_performance
     45
     46CREATE VIEW company_performance_view AS
     47SELECT
     48    to_org.company_name,
     49    COUNT(DISTINCT r.route_id) AS routes_operated,
     50    COUNT(DISTINCT t.trip_id) AS trips_organized,
     51    COUNT(tk.ticket_id) AS total_tickets_sold,
     52    SUM(COALESCE(p.total_price, 0))::double precision AS total_revenue,
     53    AVG(COALESCE(tk.price, 0))::double precision AS avg_ticket_price,
     54    COUNT(DISTINCT tk.account_id) AS unique_customers,
     55    ROUND(AVG(rev.rating)::numeric, 2)::double precision AS avg_rating
     56FROM transport_organizer to_org
     57         JOIN route r ON to_org.transport_organizer_id = r.transport_organizer_id
     58         JOIN trip t ON r.route_id = t.route_id
     59         LEFT JOIN ticket tk ON t.trip_id = tk.trip_id
     60         LEFT JOIN review rev ON tk.ticket_id = rev.ticket_id
     61         JOIN payment p ON tk.payment_id = p.payment_id
     62GROUP BY to_org.transport_organizer_id, to_org.company_name
    7263ORDER BY total_revenue DESC;
    7364
     
    183174This query retrieves the most popular routes for a specific transport organizer, ranking them by the number of tickets sold while also showing total revenue and average ticket price.
    184175{{{
     176
     177
     178CREATE VIEW top_selling_routes_view AS
    185179WITH route_stats AS (
    186     SELECT 
     180    SELECT
    187181        r.route_id,
    188         r.from_location_id,
    189         r.to_location_id,
     182        from_loc.name AS from_location_name,
     183        to_loc.name   AS to_location_name,
     184        to_org.company_name AS transport_organizer_name,
    190185        COUNT(tk.ticket_id) AS total_tickets_sold,
    191         SUM(p.total_price) AS total_revenue,
    192         AVG(p.total_price) AS avg_ticket_price
     186        SUM(p.total_price)::numeric(38,2) AS total_revenue,
     187        AVG(p.total_price)::numeric(38,2) AS avg_ticket_price
    193188    FROM route r
    194     JOIN trip tr ON r.route_id = tr.route_id
    195     JOIN ticket tk ON tr.trip_id = tk.trip_id
    196     JOIN payment p ON tk.payment_id = p.payment_id
    197     WHERE r.transport_organizer_id = 100 -- just for reference
    198     GROUP BY r.route_id, r.from_location_id, r.to_location_id
    199 )
     189             JOIN transport_organizer to_org
     190                  ON r.transport_organizer_id = to_org.transport_organizer_id
     191             JOIN location from_loc
     192                  ON r.from_location_id = from_loc.location_id
     193             JOIN location to_loc
     194                  ON r.to_location_id = to_loc.location_id
     195             JOIN trip tr ON r.route_id = tr.route_id
     196             JOIN ticket tk ON tr.trip_id = tk.trip_id
     197             JOIN payment p ON tk.payment_id = p.payment_id
     198    GROUP BY r.route_id, from_loc.name, to_loc.name, to_org.company_name
     199),
     200     max_tickets AS (
     201         SELECT MAX(total_tickets_sold) AS max_sold
     202         FROM route_stats
     203     )
    200204SELECT rs.*
    201 FROM route_stats rs
    202 WHERE rs.total_tickets_sold >= 0.8 *
    203         (SELECT
    204              MAX(total_tickets_sold) FROM route_stats) -- this is used to retrieve top selling tickets, the percentage is flexible
     205FROM route_stats rs, max_tickets mt
    205206ORDER BY rs.total_tickets_sold DESC;
    206207
     
    249250
    250251
    251 
     252Here's a short example:
     253
     254[[Image(trip_before.png)]]
     255
     256If we purchase 3 tickets:
     257
     258
     259[[Image(purchase.png)]]
     260
     261
     262We get the new seat availability:
     263
     264[[Image(trip_after.png)]]