| 1 | -- активни возења
|
|---|
| 2 | CREATE VIEW VW_ACTIVE_TRIPS AS
|
|---|
| 3 | SELECT
|
|---|
| 4 | t.TRIP_ID,
|
|---|
| 5 | t.TRIP_DATE,
|
|---|
| 6 | t.START_TIME,
|
|---|
| 7 | t.END_TIME,
|
|---|
| 8 | t.STATUS,
|
|---|
| 9 | t.TRIP_HEADSIGN,
|
|---|
| 10 | r.ROUTE_ID,
|
|---|
| 11 | r.ROUTE_NAME,
|
|---|
| 12 | v.VEHICLE_ID,
|
|---|
| 13 | v.REGISTRATION_NUMBER,
|
|---|
| 14 | v.MODEL AS VEHICLE_MODEL,
|
|---|
| 15 | vt.TYPE_NAME AS VEHICLE_TYPE,
|
|---|
| 16 | e.FIRST_NAME || ' ' || e.LAST_NAME AS DRIVER_NAME,
|
|---|
| 17 | dr.LICENSE_NUMBER
|
|---|
| 18 | FROM TRIP t
|
|---|
| 19 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 20 | JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
|
|---|
| 21 | JOIN DRIVER dr ON t.DRIVER_ID = dr.DRIVER_ID
|
|---|
| 22 | JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
|
|---|
| 23 | LEFT JOIN VEHICLE_TYPE vt ON t.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
|
|---|
| 24 | WHERE t.STATUS IN ('SCHEDULED', 'IN_PROGRESS');
|
|---|
| 25 |
|
|---|
| 26 | -- распоред на постојќи по линија
|
|---|
| 27 | CREATE VIEW VW_ROUTE_TIMETABLE AS
|
|---|
| 28 | SELECT
|
|---|
| 29 | r.ROUTE_ID,
|
|---|
| 30 | r.ROUTE_NAME,
|
|---|
| 31 | t.TRIP_ID,
|
|---|
| 32 | t.TRIP_DATE,
|
|---|
| 33 | t.DIRECTION_ID,
|
|---|
| 34 | s.STOP_ID,
|
|---|
| 35 | s.STOP_NAME,
|
|---|
| 36 | s.LATITUDE,
|
|---|
| 37 | s.LONGITUDE,
|
|---|
| 38 | st.STOP_SEQUENCE,
|
|---|
| 39 | st.ARRIVAL_TIME,
|
|---|
| 40 | st.DEPARTURE_TIME,
|
|---|
| 41 | z.ZONE_NAME
|
|---|
| 42 | FROM STOP_TIME st
|
|---|
| 43 | JOIN TRIP t ON st.TRIP_ID = t.TRIP_ID
|
|---|
| 44 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 45 | JOIN STOPS s ON st.STOP_ID = s.STOP_ID
|
|---|
| 46 | LEFT JOIN ZONE z ON s.ZONE_ID = z.ZONE_ID
|
|---|
| 47 | ORDER BY r.ROUTE_ID, t.TRIP_ID, st.STOP_SEQUENCE;
|
|---|
| 48 |
|
|---|
| 49 | -- доцнења по trip
|
|---|
| 50 | CREATE VIEW VW_TRIP_DELAYS AS
|
|---|
| 51 | SELECT
|
|---|
| 52 | t.TRIP_ID,
|
|---|
| 53 | t.TRIP_DATE,
|
|---|
| 54 | r.ROUTE_NAME,
|
|---|
| 55 | v.REGISTRATION_NUMBER,
|
|---|
| 56 | e.FIRST_NAME || ' ' || e.LAST_NAME AS DRIVER_NAME,
|
|---|
| 57 | COUNT(dl.DELAY_ID) AS TOTAL_DELAY_RECORDS,
|
|---|
| 58 | SUM(dl.DELAY_MINUTES) AS TOTAL_DELAY_MINUTES,
|
|---|
| 59 | AVG(dl.DELAY_MINUTES) AS AVG_DELAY_MINUTES,
|
|---|
| 60 | MAX(dl.DELAY_MINUTES) AS MAX_DELAY_MINUTES,
|
|---|
| 61 | STRING_AGG(DISTINCT dl.DELAY_REASON, '; ') AS DELAY_REASONS
|
|---|
| 62 | FROM TRIP t
|
|---|
| 63 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 64 | JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
|
|---|
| 65 | JOIN DRIVER dr ON t.DRIVER_ID = dr.DRIVER_ID
|
|---|
| 66 | JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
|
|---|
| 67 | JOIN DELAY_LOG dl ON t.TRIP_ID = dl.TRIP_ID
|
|---|
| 68 | GROUP BY t.TRIP_ID, t.TRIP_DATE, r.ROUTE_NAME,
|
|---|
| 69 | v.REGISTRATION_NUMBER, e.FIRST_NAME, e.LAST_NAME;
|
|---|
| 70 |
|
|---|
| 71 | -- моментална локација на возила
|
|---|
| 72 | CREATE VIEW VW_VEHICLE_CURRENT_LOCATION AS
|
|---|
| 73 | SELECT DISTINCT ON (vl.VEHICLE_ID)
|
|---|
| 74 | vl.VEHICLE_ID,
|
|---|
| 75 | v.REGISTRATION_NUMBER,
|
|---|
| 76 | vt.TYPE_NAME AS VEHICLE_TYPE,
|
|---|
| 77 | v.STATUS AS VEHICLE_STATUS,
|
|---|
| 78 | vl.TRIP_ID,
|
|---|
| 79 | r.ROUTE_NAME,
|
|---|
| 80 | vl.LATITUDE,
|
|---|
| 81 | vl.LONGITUDE,
|
|---|
| 82 | vl.SPEED_KMH,
|
|---|
| 83 | vl.OCCUPANCY_STATUS,
|
|---|
| 84 | vl.CONGESTION_LEVEL,
|
|---|
| 85 | cs.STOP_NAME AS CURRENT_STOP,
|
|---|
| 86 | ns.STOP_NAME AS NEXT_STOP,
|
|---|
| 87 | vl.DISTANCE_TO_NEXT_STOP_M,
|
|---|
| 88 | vl.RECORDED_AT
|
|---|
| 89 | FROM VEHICLE_LOG vl
|
|---|
| 90 | JOIN VEHICLE v ON vl.VEHICLE_ID = v.VEHICLE_ID
|
|---|
| 91 | JOIN TRIP t ON vl.TRIP_ID = t.TRIP_ID
|
|---|
| 92 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 93 | LEFT JOIN VEHICLE_TYPE vt ON v.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
|
|---|
| 94 | LEFT JOIN STOPS cs ON vl.CURRENT_STOP_ID = cs.STOP_ID
|
|---|
| 95 | LEFT JOIN STOPS ns ON vl.NEXT_STOP_ID = ns.STOP_ID
|
|---|
| 96 | ORDER BY vl.VEHICLE_ID, vl.RECORDED_AT DESC;
|
|---|
| 97 |
|
|---|
| 98 | -- детален тикет
|
|---|
| 99 | CREATE VIEW VW_TICKET_DETAILS AS
|
|---|
| 100 | SELECT
|
|---|
| 101 | t.TICKET_ID,
|
|---|
| 102 | p.FIRST_NAME || ' ' || p.LAST_NAME AS PASSENGER_NAME,
|
|---|
| 103 | tt.NAME AS TICKET_TYPE,
|
|---|
| 104 | t.PRICE,
|
|---|
| 105 | d.DISCOUNT_NAME,
|
|---|
| 106 | d.DISCOUNT_PERCENTAGE,
|
|---|
| 107 | r.ROUTE_NAME,
|
|---|
| 108 | s1.STOP_NAME AS FROM_STOP,
|
|---|
| 109 | s2.STOP_NAME AS TO_STOP,
|
|---|
| 110 | t.PURCHASE_DATE,
|
|---|
| 111 | t.STATUS
|
|---|
| 112 | FROM TICKET t
|
|---|
| 113 | JOIN PASSENGER p ON t.PASSENGER_ID = p.PASSENGER_ID
|
|---|
| 114 | JOIN TICKET_TYPE tt ON t.TICKET_TYPE_ID = tt.TICKET_TYPE_ID
|
|---|
| 115 | LEFT JOIN DISCOUNT d ON t.DISCOUNT_ID = d.DISCOUNT_ID
|
|---|
| 116 | LEFT JOIN TRIP tr ON t.TRIP_ID = tr.TRIP_ID
|
|---|
| 117 | LEFT JOIN ROUTE r ON tr.ROUTE_ID = r.ROUTE_ID
|
|---|
| 118 | LEFT JOIN STOPS s1 ON t.START_STOP_ID = s1.STOP_ID AND t.START_STOP_VT = s1.VEHICLE_TYPE_ID
|
|---|
| 119 | LEFT JOIN STOPS s2 ON t.END_STOP_ID = s2.STOP_ID AND t.END_STOP_VT = s2.VEHICLE_TYPE_ID;
|
|---|
| 120 |
|
|---|
| 121 | -- распоред на возачи и кондуктори
|
|---|
| 122 | CREATE VIEW VW_STAFF_SCHEDULE AS
|
|---|
| 123 | SELECT
|
|---|
| 124 | 'DRIVER' AS ROLE,
|
|---|
| 125 | ds.SCHEDULE_DATE,
|
|---|
| 126 | e.FIRST_NAME || ' ' || e.LAST_NAME AS STAFF_NAME,
|
|---|
| 127 | e.PHONE,
|
|---|
| 128 | sh.SHIFT_NAME,
|
|---|
| 129 | sh.START_TIME AS SHIFT_FROM,
|
|---|
| 130 | sh.END_TIME AS SHIFT_TO,
|
|---|
| 131 | t.TRIP_ID,
|
|---|
| 132 | r.ROUTE_NAME,
|
|---|
| 133 | v.REGISTRATION_NUMBER
|
|---|
| 134 | FROM DRIVER_SCHEDULE ds
|
|---|
| 135 | JOIN DRIVER dr ON ds.DRIVER_ID = dr.DRIVER_ID
|
|---|
| 136 | JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
|
|---|
| 137 | JOIN SHIFT sh ON ds.SHIFT_ID = sh.SHIFT_ID
|
|---|
| 138 | JOIN TRIP t ON ds.TRIP_ID = t.TRIP_ID
|
|---|
| 139 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 140 | JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
|
|---|
| 141 |
|
|---|
| 142 | UNION ALL
|
|---|
| 143 |
|
|---|
| 144 | SELECT
|
|---|
| 145 | 'CONDUCTOR' AS ROLE,
|
|---|
| 146 | cs.SCHEDULE_DATE,
|
|---|
| 147 | e.FIRST_NAME || ' ' || e.LAST_NAME AS STAFF_NAME,
|
|---|
| 148 | e.PHONE,
|
|---|
| 149 | sh.SHIFT_NAME,
|
|---|
| 150 | sh.START_TIME AS SHIFT_FROM,
|
|---|
| 151 | sh.END_TIME AS SHIFT_TO,
|
|---|
| 152 | t.TRIP_ID,
|
|---|
| 153 | r.ROUTE_NAME,
|
|---|
| 154 | v.REGISTRATION_NUMBER
|
|---|
| 155 | FROM CONDUCTOR_SCHEDULE cs
|
|---|
| 156 | JOIN CONDUCTOR c ON cs.CONDUCTOR_ID = c.CONDUCTOR_ID
|
|---|
| 157 | JOIN EMPLOYEE e ON c.EMPLOYEE_ID = e.EMPLOYEE_ID
|
|---|
| 158 | JOIN SHIFT sh ON cs.SHIFT_ID = sh.SHIFT_ID
|
|---|
| 159 | JOIN TRIP t ON cs.TRIP_ID = t.TRIP_ID
|
|---|
| 160 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 161 | JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID;
|
|---|
| 162 |
|
|---|
| 163 | -- билети
|
|---|
| 164 | CREATE VIEW VW_TICKETS_BASIC AS
|
|---|
| 165 | SELECT
|
|---|
| 166 | t.TICKET_ID,
|
|---|
| 167 | t.PASSENGER_ID,
|
|---|
| 168 | t.TRIP_ID,
|
|---|
| 169 | tt.NAME AS TICKET_TYPE,
|
|---|
| 170 | t.PRICE,
|
|---|
| 171 | t.STATUS,
|
|---|
| 172 | t.PURCHASE_DATE
|
|---|
| 173 | FROM TICKET t
|
|---|
| 174 | JOIN TICKET_TYPE tt ON t.TICKET_TYPE_ID = tt.TICKET_TYPE_ID;
|
|---|
| 175 |
|
|---|
| 176 | -- финансиски извештај по линија
|
|---|
| 177 | CREATE VIEW VW_REVENUE_BY_ROUTE AS
|
|---|
| 178 | SELECT
|
|---|
| 179 | r.ROUTE_ID,
|
|---|
| 180 | r.ROUTE_NAME,
|
|---|
| 181 | a.AGENCY_NAME,
|
|---|
| 182 | COUNT(DISTINCT t.TRIP_ID) AS TOTAL_TRIPS,
|
|---|
| 183 | COUNT(tk.TICKET_ID) AS TICKETS_SOLD,
|
|---|
| 184 | SUM(tk.PRICE) AS GROSS_REVENUE,
|
|---|
| 185 | SUM(CASE WHEN pay.PAYMENT_STATUS = 'COMPLETED'
|
|---|
| 186 | THEN pay.AMOUNT ELSE 0 END) AS COLLECTED_REVENUE,
|
|---|
| 187 | AVG(tk.PRICE) AS AVG_TICKET_PRICE
|
|---|
| 188 | FROM ROUTE r
|
|---|
| 189 | JOIN AGENCY a ON r.AGENCY_ID = a.AGENCY_ID
|
|---|
| 190 | JOIN TRIP t ON r.ROUTE_ID = t.ROUTE_ID
|
|---|
| 191 | JOIN TICKET tk ON t.TRIP_ID = tk.TRIP_ID
|
|---|
| 192 | LEFT JOIN PAYMENT pay ON tk.TICKET_ID = pay.TICKET_ID
|
|---|
| 193 | WHERE tk.STATUS NOT IN ('CANCELLED', 'REFUNDED')
|
|---|
| 194 | GROUP BY r.ROUTE_ID, r.ROUTE_NAME, a.AGENCY_NAME;
|
|---|
| 195 |
|
|---|
| 196 | -- complaints по патник
|
|---|
| 197 | CREATE VIEW VW_PASSENGER_COMPLAINTS AS
|
|---|
| 198 | SELECT
|
|---|
| 199 | p.PASSENGER_ID,
|
|---|
| 200 | p.FIRST_NAME || ' ' || p.LAST_NAME AS PASSENGER_NAME,
|
|---|
| 201 | COUNT(c.COMPLAINT_ID) AS TOTAL_COMPLAINTS,
|
|---|
| 202 | MAX(c.COMPLAINT_DATE) AS LAST_COMPLAINT_DATE
|
|---|
| 203 | FROM PASSENGER p
|
|---|
| 204 | LEFT JOIN COMPLAINT c ON p.PASSENGER_ID = c.PASSENGER_ID
|
|---|
| 205 | GROUP BY p.PASSENGER_ID, p.FIRST_NAME, p.LAST_NAME;
|
|---|
| 206 |
|
|---|
| 207 | -- нотификации по патник
|
|---|
| 208 | CREATE VIEW VW_PASSENGER_NOTIFICATIONS AS
|
|---|
| 209 | SELECT
|
|---|
| 210 | p.PASSENGER_ID,
|
|---|
| 211 | p.FIRST_NAME || ' ' || p.LAST_NAME AS PASSENGER_NAME,
|
|---|
| 212 | n.NOTIFICATION_TYPE,
|
|---|
| 213 | n.MESSAGE,
|
|---|
| 214 | n.STATUS,
|
|---|
| 215 | n.SENT_TIME
|
|---|
| 216 | FROM NOTIFICATION n
|
|---|
| 217 | JOIN PASSENGER p ON n.PASSENGER_ID = p.PASSENGER_ID;
|
|---|
| 218 |
|
|---|
| 219 | -- патници по возилo
|
|---|
| 220 | CREATE VIEW VW_VEHICLE_OCCUPANCY_STATS AS
|
|---|
| 221 | SELECT
|
|---|
| 222 | v.VEHICLE_ID,
|
|---|
| 223 | v.REGISTRATION_NUMBER,
|
|---|
| 224 | AVG(cl.PASSENGER_COUNT) AS AVG_PASSENGERS,
|
|---|
| 225 | MAX(cl.PASSENGER_COUNT) AS MAX_PASSENGERS,
|
|---|
| 226 | COUNT(cl.CAPACITY_LOG_ID) AS RECORDS
|
|---|
| 227 | FROM VEHICLE v
|
|---|
| 228 | JOIN CAPACITY_LOG cl ON v.VEHICLE_ID = cl.VEHICLE_ID
|
|---|
| 229 | GROUP BY v.VEHICLE_ID, v.REGISTRATION_NUMBER;
|
|---|
| 230 |
|
|---|
| 231 | -- Активни subscription pass картички по патник
|
|---|
| 232 | CREATE VIEW VW_PASSENGER_ACTIVE_PASSES AS
|
|---|
| 233 | SELECT
|
|---|
| 234 | sp.PASS_ID,
|
|---|
| 235 | sp.PASSENGER_ID,
|
|---|
| 236 | p.FIRST_NAME || ' ' || p.LAST_NAME AS PASSENGER_NAME,
|
|---|
| 237 | sp.PASS_TYPE,
|
|---|
| 238 | z.ZONE_NAME,
|
|---|
| 239 | sp.START_DATE,
|
|---|
| 240 | sp.END_DATE,
|
|---|
| 241 | (sp.END_DATE - CURRENT_DATE) AS DAYS_REMAINING,
|
|---|
| 242 | sp.STATUS,
|
|---|
| 243 | sp.PRICE
|
|---|
| 244 | FROM SUBSCRIPTION_PASS sp
|
|---|
| 245 | JOIN PASSENGER p ON sp.PASSENGER_ID = p.PASSENGER_ID
|
|---|
| 246 | LEFT JOIN ZONE z ON sp.ZONE_ID = z.ZONE_ID
|
|---|
| 247 | WHERE sp.STATUS = 'ACTIVE'
|
|---|
| 248 | AND sp.END_DATE >= CURRENT_DATE;
|
|---|
| 249 |
|
|---|
| 250 | -- Следни возења по постојка (за Next Departure и Journey Planner)
|
|---|
| 251 | CREATE VIEW VW_UPCOMING_TRIPS_BY_STOP AS
|
|---|
| 252 | SELECT
|
|---|
| 253 | s.STOP_ID,
|
|---|
| 254 | s.STOP_NAME,
|
|---|
| 255 | s.LATITUDE,
|
|---|
| 256 | s.LONGITUDE,
|
|---|
| 257 | z.ZONE_NAME,
|
|---|
| 258 | r.ROUTE_ID,
|
|---|
| 259 | r.ROUTE_NAME,
|
|---|
| 260 | t.TRIP_ID,
|
|---|
| 261 | t.TRIP_DATE,
|
|---|
| 262 | t.TRIP_HEADSIGN,
|
|---|
| 263 | t.DIRECTION_ID,
|
|---|
| 264 | st.STOP_SEQUENCE,
|
|---|
| 265 | st.ARRIVAL_TIME,
|
|---|
| 266 | st.DEPARTURE_TIME,
|
|---|
| 267 | vt.TYPE_NAME AS VEHICLE_TYPE,
|
|---|
| 268 | v.REGISTRATION_NUMBER,
|
|---|
| 269 | t.STATUS AS TRIP_STATUS,
|
|---|
| 270 | CASE
|
|---|
| 271 | WHEN t.TRIP_DATE = CURRENT_DATE
|
|---|
| 272 | THEN EXTRACT(EPOCH FROM (st.DEPARTURE_TIME - LOCALTIME)) / 60
|
|---|
| 273 | ELSE NULL
|
|---|
| 274 | END AS MINUTES_UNTIL_DEPARTURE
|
|---|
| 275 | FROM STOP_TIME st
|
|---|
| 276 | JOIN STOPS s ON st.STOP_ID = s.STOP_ID
|
|---|
| 277 | JOIN TRIP t ON st.TRIP_ID = t.TRIP_ID
|
|---|
| 278 | JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
|
|---|
| 279 | JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
|
|---|
| 280 | LEFT JOIN ZONE z ON s.ZONE_ID = z.ZONE_ID
|
|---|
| 281 | LEFT JOIN VEHICLE_TYPE vt ON t.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
|
|---|
| 282 | WHERE t.STATUS IN ('SCHEDULED', 'IN_PROGRESS')
|
|---|
| 283 | AND t.TRIP_DATE = CURRENT_DATE
|
|---|
| 284 | AND st.DEPARTURE_TIME >= LOCALTIME
|
|---|
| 285 | ORDER BY s.STOP_ID, st.DEPARTURE_TIME;
|
|---|
| 286 |
|
|---|
| 287 | -- Потрошувачка на гориво по возило
|
|---|
| 288 | CREATE VIEW VW_FUEL_CONSUMPTION AS
|
|---|
| 289 | SELECT
|
|---|
| 290 | v.VEHICLE_ID,
|
|---|
| 291 | v.REGISTRATION_NUMBER,
|
|---|
| 292 | vt.TYPE_NAME AS VEHICLE_TYPE,
|
|---|
| 293 | v.STATUS AS VEHICLE_STATUS,
|
|---|
| 294 | COUNT(fl.FUEL_LOG_ID) AS TOTAL_REFUELS,
|
|---|
| 295 | SUM(fl.FUEL_AMOUNT) AS TOTAL_FUEL_L,
|
|---|
| 296 | AVG(fl.FUEL_AMOUNT) AS AVG_FUEL_PER_REFUEL_L,
|
|---|
| 297 | SUM(fl.FUEL_COST) AS TOTAL_FUEL_COST,
|
|---|
| 298 | AVG(fl.FUEL_COST) AS AVG_FUEL_COST,
|
|---|
| 299 | MAX(fl.FUEL_DATE) AS LAST_REFUEL_DATE,
|
|---|
| 300 | SUM(CASE
|
|---|
| 301 | WHEN fl.FUEL_DATE >= CURRENT_DATE - INTERVAL '30 days'
|
|---|
| 302 | THEN fl.FUEL_AMOUNT ELSE 0
|
|---|
| 303 | END) AS FUEL_L_LAST_30_DAYS,
|
|---|
| 304 | SUM(CASE
|
|---|
| 305 | WHEN fl.FUEL_DATE >= CURRENT_DATE - INTERVAL '30 days'
|
|---|
| 306 | THEN fl.FUEL_COST ELSE 0
|
|---|
| 307 | END) AS COST_LAST_30_DAYS
|
|---|
| 308 | FROM VEHICLE v
|
|---|
| 309 | LEFT JOIN FUEL_LOG fl ON v.VEHICLE_ID = fl.VEHICLE_ID
|
|---|
| 310 | LEFT JOIN VEHICLE_TYPE vt ON v.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
|
|---|
| 311 | GROUP BY v.VEHICLE_ID, v.REGISTRATION_NUMBER,
|
|---|
| 312 | vt.TYPE_NAME, v.STATUS; |
|---|