DatabaseCreation: viewsUpdated.sql

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