-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path6_SPMS_View_Creation.sql
More file actions
413 lines (322 loc) · 12.5 KB
/
6_SPMS_View_Creation.sql
File metadata and controls
413 lines (322 loc) · 12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
------------------------------------------------------EXECUTE THIS SCRIPT TO CREATE VIEWS-------------------------------------------------------
--Execution Order: 6
--Execute using user: PLADMIN
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
SET AUTOCOMMIT ON;
CLEAR SCREEN;
SET SERVEROUTPUT ON;
--1) Manager Views --> parking_slots_filled
-- Creating or replacing the parking_slots_filled view
CREATE OR REPLACE VIEW parking_slots_filled AS
SELECT
-- Selecting parking slot details along with related floor, parking lot, and customer information
ps.PARKING_SLOT_ID,
ps.SLOT_NAME,
f.FLOOR_LEVEL,
pl.NAME AS PARKING_LOT_NAME,
a.STREET_ADDRESS,
a.CITY,
a.STATE,
a.COUNTRY,
v.REGISTRATION_NO,
-- Concatenating first name and last name for full customer name
c.FIRST_NAME || ' ' || c.LAST_NAME AS CUSTOMER_NAME
FROM PARKING_SLOT ps
-- Joining with floors, parking lots, addresses, slot bookings, vehicles, and customers to get comprehensive details
JOIN FLOOR f ON ps.FLOOR_ID = f.FLOOR_ID
JOIN PARKING_LOT pl ON f.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN ADDRESS a ON pl.ADDRESS_ID = a.ADDRESS_ID
JOIN SLOT_BOOKING sb ON ps.PARKING_SLOT_ID = sb.PARKING_SLOT_ID
JOIN VEHICLE v ON sb.VEHICLE_ID = v.VEHICLE_ID
JOIN CUSTOMER c ON v.CUSTOMER_ID = c.CUSTOMER_ID
-- Filtering for slots that are occupied within the hardcoded time
-- Note: For real-time data, replace the hardcoded date with SYSDATE
WHERE TO_DATE('2024-03-03 10:00:00', 'YYYY-MM-DD HH24:MI:SS') BETWEEN sb.SCHEDULED_START_TIME AND sb.SCHEDULED_END_TIME
ORDER BY ps.PARKING_SLOT_ID; -- Sorting results by parking slot ID for easier readability
--2) Manager Views --> parking_slot_vacant
-- Creating or replacing the parking_slots_vacant view
CREATE OR REPLACE VIEW parking_slots_vacant AS
SELECT DISTINCT
-- Selecting distinct parking slot details along with related floor and parking lot information
ps.PARKING_SLOT_ID,
ps.SLOT_NAME,
f.FLOOR_LEVEL,
pl.NAME AS PARKING_LOT_NAME,
a.STREET_ADDRESS,
a.CITY,
a.STATE,
a.COUNTRY
FROM PARKING_SLOT ps
-- Joining with floors, parking lots, and addresses to get comprehensive details
JOIN FLOOR f ON ps.FLOOR_ID = f.FLOOR_ID
JOIN PARKING_LOT pl ON f.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN ADDRESS a ON pl.ADDRESS_ID = a.ADDRESS_ID
WHERE NOT EXISTS (
-- Using a subquery to exclude slots that have bookings overlapping with the specified timestamp
SELECT 1
FROM SLOT_BOOKING sb
WHERE sb.PARKING_SLOT_ID = ps.PARKING_SLOT_ID
-- Note: For real-time data, replace the hardcoded date with SYSDATE
AND TO_DATE('2024-03-03 10:00:00', 'YYYY-MM-DD HH24:MI:SS') BETWEEN sb.SCHEDULED_START_TIME AND sb.SCHEDULED_END_TIME
)
ORDER BY ps.PARKING_SLOT_ID; -- Sorting results by parking slot ID to ensure a consistent order
--3) Manager Views --> customer_feedback
-- Creating or replacing the customer_feedback view
-- This view aggregates customer feedback along with detailed information about the parking slots and lots involved.
CREATE OR REPLACE VIEW customer_feedback AS
SELECT
-- Concatenating first name and last name to get the full customer name.
c.FIRST_NAME || ' ' || c.LAST_NAME AS CUSTOMER_NAME,
-- Including customer's email and mobile number for potential contact.
c.EMAIL,
c.MOBILE_NO,
-- Feedback details: rating and comments.
f.RATING,
f.COMMENTS,
-- Details of the parking lot where the feedback is associated.
pl.NAME AS PARKING_LOT_NAME,
-- The specific parking slot that the feedback pertains to.
ps.SLOT_NAME,
-- The floor level of the parking slot, adding another layer of specificity.
fl.FLOOR_LEVEL,
-- Formatting the actual start and end times of the parking usage for readability.
-- These times are fetched from the CHECK_IN table, providing real usage data.
TO_CHAR(ci.ACTUAL_START_TIME, 'DD-MON-YYYY HH:MI AM') AS ACTUAL_START_TIME,
TO_CHAR(ci.ACTUAL_END_TIME, 'DD-MON-YYYY HH:MI AM') AS ACTUAL_END_TIME
FROM CUSTOMER c
JOIN VEHICLE v ON c.CUSTOMER_ID = v.CUSTOMER_ID
JOIN SLOT_BOOKING sb ON v.VEHICLE_ID = sb.VEHICLE_ID
JOIN PARKING_SLOT ps ON sb.PARKING_SLOT_ID = ps.PARKING_SLOT_ID
JOIN FLOOR fl ON ps.FLOOR_ID = fl.FLOOR_ID
JOIN PARKING_LOT pl ON fl.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN CHECK_IN ci ON sb.SLOT_BOOKING_ID = ci.SLOT_BOOKING_ID
JOIN FEEDBACK f ON ci.CHECK_IN_ID = f.CHECK_IN_ID;
--4) Manager Views --> peak_hours
-- Create or replace the existing view named peak_hours
CREATE OR REPLACE VIEW peak_hours AS
SELECT
-- Select parking lot ID, name, and pricing per hour from the parking_lot table
pl.NAME AS parking_lot_name,
-- Format and select the start time of the peak hour by truncating the scheduled start time to the nearest hour
TO_CHAR(TRUNC(sb.SCHEDULED_START_TIME, 'HH24'), 'HH:MI AM') AS peak_hour_start_time,
-- Calculate and format the end time of the peak hour by adding 1 hour to the start time and subtracting 1 second
TO_CHAR(TRUNC(sb.SCHEDULED_START_TIME, 'HH24') + INTERVAL '1' HOUR - INTERVAL '1' SECOND, 'HH:MI AM') AS peak_hour_end_time,
-- Count the number of bookings for each time slot
COUNT(*) AS booking_count
FROM
SLOT_BOOKING sb
JOIN PARKING_SLOT ps ON sb.PARKING_SLOT_ID = ps.PARKING_SLOT_ID
JOIN FLOOR f ON ps.FLOOR_ID = f.FLOOR_ID
JOIN PARKING_LOT pl ON f.PARKING_LOT_ID = pl.PARKING_LOT_ID
GROUP BY
-- Group the results by parking lot ID and the hour of the booking start time
pl.PARKING_LOT_ID, pl.NAME, pl.PRICING_PER_HOUR, TRUNC(sb.SCHEDULED_START_TIME, 'HH24')
ORDER BY
-- Order the results first by parking lot ID, and then by the number of bookings in descending order
pl.PARKING_LOT_ID, COUNT(*) DESC;
--5) Manager Views --> Off_peak_hours
CREATE OR REPLACE VIEW off_peak_hours AS
SELECT
date_range."DATE",
hour_of_day.hour,
ps.parking_slot_id,
ps.slot_name
FROM
(
SELECT
trunc(sysdate - level) AS "DATE"
FROM
dual
CONNECT BY level <= 24
AND trunc(sysdate - level) >= trunc(sysdate - INTERVAL '1' MONTH)
) date_range
CROSS JOIN (
SELECT
level - 1 AS hour
FROM
dual
CONNECT BY
level <= 24
) hour_of_day
CROSS JOIN parking_slot ps
LEFT JOIN slot_booking sb ON ps.parking_slot_id = sb.parking_slot_id
AND date_range."DATE" = trunc(sb.scheduled_start_time)
AND hour_of_day.hour = EXTRACT(HOUR FROM sb.scheduled_start_time)
WHERE
sb.slot_booking_id IS NULL
AND NOT EXISTS (
SELECT
1
FROM
slot_booking sb2
WHERE
ps.parking_slot_id = sb2.parking_slot_id
AND trunc(date_range."DATE") = trunc(sb2.scheduled_start_time)
AND hour_of_day.hour >= EXTRACT(HOUR FROM sb2.scheduled_start_time)
AND hour_of_day.hour < EXTRACT(HOUR FROM sb2.scheduled_end_time)
)
ORDER BY
ps.parking_slot_id,
hour_of_day.hour;
--6) Manager Views --> parking_lot_performance
CREATE OR REPLACE VIEW parking_lot_performance_by_day AS
SELECT
pl.parking_lot_id,
pl.name AS parking_lot_name,
nvl(to_char(sb.scheduled_start_time, 'YYYY-MM-DD'),
'No Booking') AS booking_date,
COUNT(DISTINCT sb.slot_booking_id) AS total_bookings,
nvl(SUM(EXTRACT(HOUR FROM(sb.scheduled_end_time - sb.scheduled_start_time))),
0) AS total_hours,
nvl(SUM(EXTRACT(HOUR FROM(sb.scheduled_end_time - sb.scheduled_start_time)) * pl.pricing_per_hour),
0) AS total_amount
FROM
parking_lot pl
LEFT JOIN floor fl ON pl.parking_lot_id = fl.parking_lot_id
LEFT JOIN parking_slot ps ON fl.floor_id = ps.floor_id
LEFT JOIN slot_booking sb ON ps.parking_slot_id = sb.parking_slot_id
GROUP BY
pl.parking_lot_id,
pl.name,
nvl(to_char(sb.scheduled_start_time, 'YYYY-MM-DD'),
'No Booking')
ORDER BY
pl.parking_lot_id,
booking_date;
--7) Manager Views --> no_show_bookings
CREATE OR REPLACE VIEW NO_SHOW_BOOKINGS AS
SELECT
sb.SLOT_BOOKING_ID,
sb.SCHEDULED_START_TIME AS BOOKED_START_TIME,
sb.SCHEDULED_END_TIME AS BOOKED_END_TIME,
v.REGISTRATION_NO AS VEHICLE_REGISTRATION,
c.CUSTOMER_ID,
c.FIRST_NAME,
c.LAST_NAME,
c.EMAIL,
c.MOBILE_NO
FROM
SLOT_BOOKING sb
JOIN
VEHICLE v ON sb.VEHICLE_ID = v.VEHICLE_ID
JOIN
CUSTOMER c ON v.CUSTOMER_ID = c.CUSTOMER_ID
LEFT JOIN
CHECK_IN ci ON sb.SLOT_BOOKING_ID = ci.SLOT_BOOKING_ID
WHERE
ci.CHECK_IN_ID IS NULL;
-- 1) Customer Views --> View to show customer's vehicles
CREATE OR REPLACE VIEW CUSTOMER_VEHICLES AS
SELECT
c.FIRST_NAME || ' ' || c.LAST_NAME AS CUSTOMER_NAME,
v.REGISTRATION_NO AS VEHICLE_REGISTRATION_NO
FROM
CUSTOMER c
JOIN
VEHICLE v ON c.CUSTOMER_ID = v.CUSTOMER_ID;
-- 2) Customer Views --> View to display booking details
CREATE OR REPLACE VIEW BOOKING_DETAILS AS
SELECT
sb.SLOT_BOOKING_ID,
v.REGISTRATION_NO AS VEHICLE_REGISTRATION_NO,
TO_CHAR(sb.SCHEDULED_START_TIME, 'YYYY-MM-DD HH24:MI:SS') AS SCHEDULED_CHECK_IN_TIME,
TO_CHAR(sb.SCHEDULED_END_TIME, 'YYYY-MM-DD HH24:MI:SS') AS SCHEDULED_CHECK_OUT_TIME,
ps.SLOT_NAME AS PARKING_SLOT_NAME,
pl.NAME AS PARKING_LOT_NAME,
a.STREET_ADDRESS || ', ' || a.CITY || ', ' || a.STATE || ', ' || a.COUNTRY AS PARKING_LOT_ADDRESS,
p.AMOUNT AS PAYMENT_AMOUNT,
c.CUSTOMER_ID AS CUSTOMER_ID
FROM
SLOT_BOOKING sb
JOIN
PARKING_SLOT ps ON sb.PARKING_SLOT_ID = ps.PARKING_SLOT_ID
JOIN
FLOOR f ON ps.FLOOR_ID = f.FLOOR_ID
JOIN
PARKING_LOT pl ON f.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN
ADDRESS a ON pl.ADDRESS_ID = a.ADDRESS_ID
JOIN
VEHICLE v ON sb.VEHICLE_ID = v.VEHICLE_ID
JOIN
PAYMENT p ON sb.PAYMENT_ID = p.PAYMENT_ID
JOIN
CUSTOMER c ON v.CUSTOMER_ID = c.CUSTOMER_ID
ORDER BY
sb.SLOT_BOOKING_ID DESC;
-- 3) Customer Views --> View to display booking history
CREATE OR REPLACE VIEW BOOKING_HISTORY AS
SELECT
sb.SLOT_BOOKING_ID,
TO_CHAR(sb.SCHEDULED_START_TIME, 'YYYY-MM-DD HH24:MI:SS') AS SCHEDULED_CHECK_IN_TIME,
CASE WHEN ci.ACTUAL_START_TIME IS NULL THEN 'Not Checked In yet' ELSE TO_CHAR(ci.ACTUAL_START_TIME, 'YYYY-MM-DD HH24:MI:SS') END AS ACTUAL_CHECK_IN_TIME,
TO_CHAR(sb.SCHEDULED_END_TIME, 'YYYY-MM-DD HH24:MI:SS') AS SCHEDULED_CHECK_OUT_TIME,
CASE WHEN ci.ACTUAL_END_TIME IS NULL THEN 'Not Checked Out yet' ELSE TO_CHAR(ci.ACTUAL_END_TIME, 'YYYY-MM-DD HH24:MI:SS') END AS ACTUAL_CHECK_OUT_TIME,
ps.PARKING_SLOT_ID,
pl.PARKING_LOT_ID,
fl.FLOOR_ID,
v.REGISTRATION_NO AS VEHICLE_REGISTRATION_NO,
TO_CHAR(p.TRANSACTION_DATE , 'YYYY-MM-DD HH24:MI:SS') AS PAYMENT_DATE,
p.AMOUNT AS PAYMENT_AMOUNT,
NVL(TO_CHAR(f.RATING), 'Not provided') AS FEEDBACK_RATING,
NVL(f.COMMENTS, 'Not provided') AS FEEDBACK_COMMENTS,
c.CUSTOMER_ID AS CUSTOMER_ID
FROM
SLOT_BOOKING sb
JOIN
PARKING_SLOT ps ON sb.PARKING_SLOT_ID = ps.PARKING_SLOT_ID
JOIN
FLOOR fl ON ps.FLOOR_ID = fl.FLOOR_ID
JOIN
PARKING_LOT pl ON fl.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN
VEHICLE v ON sb.VEHICLE_ID = v.VEHICLE_ID
LEFT JOIN
CHECK_IN ci ON sb.SLOT_BOOKING_ID = ci.SLOT_BOOKING_ID
LEFT JOIN
PAYMENT p ON sb.PAYMENT_ID = p.PAYMENT_ID
LEFT JOIN
FEEDBACK f ON ci.CHECK_IN_ID = f.CHECK_IN_ID
JOIN
CUSTOMER c ON v.CUSTOMER_ID = c.CUSTOMER_ID;
-- 4) Customer Views --> View to display parking lot ratings
CREATE OR REPLACE VIEW PARKING_LOT_RATING AS
SELECT
pl.PARKING_LOT_ID,
pl.NAME AS PARKING_LOT_NAME,
NVL(TO_CHAR(ROUND(AVG(f.RATING), 2), '999.99'), 'No ratings') AS AVERAGE_RATING
FROM
PARKING_LOT pl
LEFT JOIN
FLOOR fl ON pl.PARKING_LOT_ID = fl.PARKING_LOT_ID
LEFT JOIN
PARKING_SLOT ps ON fl.FLOOR_ID = ps.FLOOR_ID
LEFT JOIN
SLOT_BOOKING sb ON ps.PARKING_SLOT_ID = sb.PARKING_SLOT_ID
LEFT JOIN
CHECK_IN ci ON sb.SLOT_BOOKING_ID = ci.SLOT_BOOKING_ID
LEFT JOIN
FEEDBACK f ON ci.CHECK_IN_ID = f.CHECK_IN_ID
GROUP BY
pl.PARKING_LOT_ID,
pl.NAME;
-- 5) Customer Views --> AVAILABLE SLOTS
CREATE OR REPLACE VIEW AVAILABLE_SLOTS AS
SELECT
ps.PARKING_SLOT_ID,
ps.SLOT_NAME,
f.FLOOR_LEVEL,
pl.NAME AS PARKING_LOT_NAME,
a.STREET_ADDRESS,
a.CITY,
a.STATE,
a.COUNTRY,
a.ZIP_CODE
FROM
PARKING_SLOT ps
JOIN
FLOOR f ON ps.FLOOR_ID = f.FLOOR_ID
JOIN
PARKING_LOT pl ON f.PARKING_LOT_ID = pl.PARKING_LOT_ID
JOIN
ADDRESS a ON pl.ADDRESS_ID = a.ADDRESS_ID;