DatabaseCreation: views.sql

File views.sql, 10.6 KB (added by 231151, 6 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 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
18FROM TRIP t
19JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
20JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
21JOIN DRIVER dr ON t.DRIVER_ID = dr.DRIVER_ID
22JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
23LEFT JOIN VEHICLE_TYPE vt ON t.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
24WHERE t.STATUS IN ('SCHEDULED', 'IN_PROGRESS');
25
26-- распоред на постојќи по линија
27CREATE VIEW VW_ROUTE_TIMETABLE AS
28SELECT
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
42FROM STOP_TIME st
43JOIN TRIP t ON st.TRIP_ID = t.TRIP_ID
44JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
45JOIN STOPS s ON st.STOP_ID = s.STOP_ID
46LEFT JOIN ZONE z ON s.ZONE_ID = z.ZONE_ID
47ORDER BY r.ROUTE_ID, t.TRIP_ID, st.STOP_SEQUENCE;
48
49-- доцнења по trip
50CREATE VIEW VW_TRIP_DELAYS AS
51SELECT
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
62FROM TRIP t
63JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
64JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
65JOIN DRIVER dr ON t.DRIVER_ID = dr.DRIVER_ID
66JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
67JOIN DELAY_LOG dl ON t.TRIP_ID = dl.TRIP_ID
68GROUP BY t.TRIP_ID, t.TRIP_DATE, r.ROUTE_NAME,
69 v.REGISTRATION_NUMBER, e.FIRST_NAME, e.LAST_NAME;
70
71-- моментална локација на возила
72CREATE VIEW VW_VEHICLE_CURRENT_LOCATION AS
73SELECT 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
89FROM VEHICLE_LOG vl
90JOIN VEHICLE v ON vl.VEHICLE_ID = v.VEHICLE_ID
91JOIN TRIP t ON vl.TRIP_ID = t.TRIP_ID
92JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
93LEFT JOIN VEHICLE_TYPE vt ON v.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
94LEFT JOIN STOPS cs ON vl.CURRENT_STOP_ID = cs.STOP_ID
95LEFT JOIN STOPS ns ON vl.NEXT_STOP_ID = ns.STOP_ID
96ORDER BY vl.VEHICLE_ID, vl.RECORDED_AT DESC;
97
98-- детален тикет
99CREATE VIEW VW_TICKET_DETAILS AS
100SELECT
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
112FROM TICKET t
113JOIN PASSENGER p ON t.PASSENGER_ID = p.PASSENGER_ID
114JOIN TICKET_TYPE tt ON t.TICKET_TYPE_ID = tt.TICKET_TYPE_ID
115LEFT JOIN DISCOUNT d ON t.DISCOUNT_ID = d.DISCOUNT_ID
116LEFT JOIN TRIP tr ON t.TRIP_ID = tr.TRIP_ID
117LEFT JOIN ROUTE r ON tr.ROUTE_ID = r.ROUTE_ID
118LEFT JOIN STOPS s1 ON t.START_STOP_ID = s1.STOP_ID AND t.START_STOP_VT = s1.VEHICLE_TYPE_ID
119LEFT JOIN STOPS s2 ON t.END_STOP_ID = s2.STOP_ID AND t.END_STOP_VT = s2.VEHICLE_TYPE_ID;
120
121-- распоред на возачи и кондуктори
122CREATE VIEW VW_STAFF_SCHEDULE AS
123SELECT
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
134FROM DRIVER_SCHEDULE ds
135JOIN DRIVER dr ON ds.DRIVER_ID = dr.DRIVER_ID
136JOIN EMPLOYEE e ON dr.EMPLOYEE_ID = e.EMPLOYEE_ID
137JOIN SHIFT sh ON ds.SHIFT_ID = sh.SHIFT_ID
138JOIN TRIP t ON ds.TRIP_ID = t.TRIP_ID
139JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
140JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
141
142UNION ALL
143
144SELECT
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
155FROM CONDUCTOR_SCHEDULE cs
156JOIN CONDUCTOR c ON cs.CONDUCTOR_ID = c.CONDUCTOR_ID
157JOIN EMPLOYEE e ON c.EMPLOYEE_ID = e.EMPLOYEE_ID
158JOIN SHIFT sh ON cs.SHIFT_ID = sh.SHIFT_ID
159JOIN TRIP t ON cs.TRIP_ID = t.TRIP_ID
160JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
161JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID;
162
163-- билети
164CREATE VIEW VW_TICKETS_BASIC AS
165SELECT
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
173FROM TICKET t
174JOIN TICKET_TYPE tt ON t.TICKET_TYPE_ID = tt.TICKET_TYPE_ID;
175
176-- финансиски извештај по линија
177CREATE VIEW VW_REVENUE_BY_ROUTE AS
178SELECT
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
188FROM ROUTE r
189JOIN AGENCY a ON r.AGENCY_ID = a.AGENCY_ID
190JOIN TRIP t ON r.ROUTE_ID = t.ROUTE_ID
191JOIN TICKET tk ON t.TRIP_ID = tk.TRIP_ID
192LEFT JOIN PAYMENT pay ON tk.TICKET_ID = pay.TICKET_ID
193WHERE tk.STATUS NOT IN ('CANCELLED', 'REFUNDED')
194GROUP BY r.ROUTE_ID, r.ROUTE_NAME, a.AGENCY_NAME;
195
196-- complaints по патник
197CREATE VIEW VW_PASSENGER_COMPLAINTS AS
198SELECT
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
203FROM PASSENGER p
204LEFT JOIN COMPLAINT c ON p.PASSENGER_ID = c.PASSENGER_ID
205GROUP BY p.PASSENGER_ID, p.FIRST_NAME, p.LAST_NAME;
206
207-- нотификации по патник
208CREATE VIEW VW_PASSENGER_NOTIFICATIONS AS
209SELECT
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
216FROM NOTIFICATION n
217JOIN PASSENGER p ON n.PASSENGER_ID = p.PASSENGER_ID;
218
219-- патници по возилo
220CREATE VIEW VW_VEHICLE_OCCUPANCY_STATS AS
221SELECT
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
227FROM VEHICLE v
228JOIN CAPACITY_LOG cl ON v.VEHICLE_ID = cl.VEHICLE_ID
229GROUP BY v.VEHICLE_ID, v.REGISTRATION_NUMBER;
230
231-- Активни subscription pass картички по патник
232CREATE VIEW VW_PASSENGER_ACTIVE_PASSES AS
233SELECT
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
244FROM SUBSCRIPTION_PASS sp
245JOIN PASSENGER p ON sp.PASSENGER_ID = p.PASSENGER_ID
246LEFT JOIN ZONE z ON sp.ZONE_ID = z.ZONE_ID
247WHERE sp.STATUS = 'ACTIVE'
248 AND sp.END_DATE >= CURRENT_DATE;
249
250-- Следни возења по постојка (за Next Departure и Journey Planner)
251CREATE VIEW VW_UPCOMING_TRIPS_BY_STOP AS
252SELECT
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
275FROM STOP_TIME st
276JOIN STOPS s ON st.STOP_ID = s.STOP_ID
277JOIN TRIP t ON st.TRIP_ID = t.TRIP_ID
278JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
279JOIN VEHICLE v ON t.VEHICLE_ID = v.VEHICLE_ID
280LEFT JOIN ZONE z ON s.ZONE_ID = z.ZONE_ID
281LEFT JOIN VEHICLE_TYPE vt ON t.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
282WHERE t.STATUS IN ('SCHEDULED', 'IN_PROGRESS')
283 AND t.TRIP_DATE = CURRENT_DATE
284 AND st.DEPARTURE_TIME >= LOCALTIME
285ORDER BY s.STOP_ID, st.DEPARTURE_TIME;
286
287-- Потрошувачка на гориво по возило
288CREATE VIEW VW_FUEL_CONSUMPTION AS
289SELECT
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
308FROM VEHICLE v
309LEFT JOIN FUEL_LOG fl ON v.VEHICLE_ID = fl.VEHICLE_ID
310LEFT JOIN VEHICLE_TYPE vt ON v.VEHICLE_TYPE_ID = vt.VEHICLE_TYPE_ID
311GROUP BY v.VEHICLE_ID, v.REGISTRATION_NUMBER,
312 vt.TYPE_NAME, v.STATUS;