| 124 | |
| 125 | WITH destinations AS ( |
| 126 | SELECT |
| 127 | l.name AS destination, |
| 128 | COUNT(t.ticket_id) AS total_passengers, |
| 129 | COUNT(DISTINCT t.account_id) AS unique_customers, |
| 130 | SUM(t.price) AS total_revenue, |
| 131 | COUNT(st.student_ticket_id) AS student_tickets, |
| 132 | COUNT(ct.child_ticket_id) AS child_tickets, |
| 133 | l.latitude, |
| 134 | l.longitude |
| 135 | FROM location l |
| 136 | JOIN ticket t ON l.location_id = t.gets_off_location_id |
| 137 | JOIN trip tr ON t.trip_id = tr.trip_id |
| 138 | JOIN transport_organizer to_org ON tr.transport_organizer_id = to_org.transport_organizer_id |
| 139 | LEFT JOIN student_ticket st ON t.ticket_id = st.ticket_id |
| 140 | LEFT JOIN child_ticket ct ON t.ticket_id = ct.ticket_id |
| 141 | GROUP BY l.location_id, l.name, l.latitude, l.longitude |
| 142 | ), |
| 143 | stats AS ( |
| 144 | SELECT AVG(total_passengers) AS mean_passengers -- this is used to avoid hard limits |
| 145 | FROM destinations |
| 146 | ) |
123 | | l.name AS destination, |
124 | | COUNT(t.ticket_id) AS total_passengers, |
125 | | COUNT(DISTINCT t.account_id) AS unique_customers, |
126 | | SUM(t.price) AS total_revenue, |
127 | | COUNT(st.student_ticket_id) AS student_tickets, |
128 | | COUNT(ct.child_ticket_id) AS child_tickets |
129 | | FROM location l |
130 | | JOIN ticket t ON l.location_id = t.gets_off_location_id |
131 | | JOIN trip tr ON t.trip_id = tr.trip_id |
132 | | JOIN transport_organizer TO_id ON tr.transport_organizer_id = TO_id.transport_organizer_id |
133 | | LEFT JOIN student_ticket st ON t.ticket_id = st.ticket_id |
134 | | LEFT JOIN child_ticket ct ON t.ticket_id = ct.ticket_id |
135 | | WHERE t.date_purchased >= CURRENT_DATE - INTERVAL '1 year' |
136 | | GROUP BY l.location_id, l.name, l.latitude, l.longitude |
137 | | ORDER BY total_passengers DESC |
138 | | LIMIT 5; |
| 148 | d.destination, |
| 149 | d.total_passengers, |
| 150 | d.unique_customers, |
| 151 | d.total_revenue, |
| 152 | d.student_tickets, |
| 153 | d.child_tickets |
| 154 | FROM destinations d, stats |
| 155 | WHERE d.total_passengers >= stats.mean_passengers |
| 156 | ORDER BY d.total_passengers DESC; |
| 157 | |
146 | | SELECT |
147 | | r.route_id, |
148 | | r.from_location_id, |
149 | | r.to_location_id, |
150 | | COUNT(tk.ticket_id) AS total_tickets_sold, |
151 | | SUM(p.total_price) AS total_revenue, |
152 | | AVG(p.total_price) AS avg_ticket_price |
153 | | FROM route r |
154 | | JOIN trip tr ON r.route_id = tr.route_id |
155 | | JOIN ticket tk ON tr.trip_id = tk.trip_id |
156 | | JOIN payment p ON tk.payment_id = p.payment_id |
157 | | WHERE r.transport_organizer_id = 100 -- just for reference |
158 | | GROUP BY r.route_id, r.from_location_id, r.to_location_id |
159 | | ORDER BY total_tickets_sold DESC |
160 | | LIMIT 5; |
| 165 | WITH route_stats AS ( |
| 166 | SELECT |
| 167 | r.route_id, |
| 168 | r.from_location_id, |
| 169 | r.to_location_id, |
| 170 | COUNT(tk.ticket_id) AS total_tickets_sold, |
| 171 | SUM(p.total_price) AS total_revenue, |
| 172 | AVG(p.total_price) AS avg_ticket_price |
| 173 | FROM route r |
| 174 | JOIN trip tr ON r.route_id = tr.route_id |
| 175 | JOIN ticket tk ON tr.trip_id = tk.trip_id |
| 176 | JOIN payment p ON tk.payment_id = p.payment_id |
| 177 | WHERE r.transport_organizer_id = 100 -- just for reference |
| 178 | GROUP BY r.route_id, r.from_location_id, r.to_location_id |
| 179 | ) |
| 180 | SELECT rs.* |
| 181 | FROM route_stats rs |
| 182 | WHERE rs.total_tickets_sold >= 0.8 * |
| 183 | (SELECT |
| 184 | MAX(total_tickets_sold) FROM route_stats) -- this is used to retrieve top selling tickets, the percentage is flexible |
| 185 | ORDER BY rs.total_tickets_sold DESC; |
| 186 | |