F2: paws_care_views.sql

File paws_care_views.sql, 9.1 KB (added by 231140, 9 hours ago)

Views in Paws Care DB

Line 
1CREATE VIEW View_Low_Stock_Products AS
2SELECT product_id,
3 name,
4 stock_quantity,
5 reorder_level
6FROM Product
7WHERE stock_quantity <= reorder_level;
8
9
10CREATE VIEW View_Treatment_Revenue_Summary AS
11SELECT t.name AS treatment_name,
12 COUNT(pt.performed_treatment_id) AS times_performed,
13 SUM(t.price) AS total_revenue,
14 ROUND(AVG(t.price), 2) AS average_price
15FROM Treatment t
16 JOIN Performed_Treatment pt ON t.treatment_id = pt.treatment_id
17GROUP BY t.name
18ORDER BY total_revenue DESC;
19
20
21CREATE VIEW View_Review_Stats AS
22SELECT owner_id,
23 ROUND(AVG(rating), 2) AS average_rating,
24 COUNT(comment) AS total_comments,
25 AVG(LENGTH(comment)) AS avg_comment_length
26FROM Review
27GROUP BY owner_id;
28
29
30CREATE VIEW View_Pet_Owners AS
31SELECT p.pet_id,
32 p.name AS pet_name,
33 p.type_of_animal,
34 p.breed,
35 o.owner_id,
36 pers.name || ' ' || pers.surname AS owner_full_name,
37 pers.phone_number,
38 opp.is_primary_owner
39FROM Pet p
40 JOIN Owner_Pet_Pair opp ON p.pet_id = opp.pet_id
41 JOIN Owner o ON opp.owner_id = o.owner_id
42 JOIN Person pers ON o.owner_id = pers.person_id;
43
44
45CREATE VIEW View_Pet_Vaccination_Status AS
46SELECT opp.owner_id,
47 pet.pet_id,
48 pet.name AS pet_name,
49 v_info.trade_name AS vaccine,
50 vacc.date AS last_dose_date,
51 vacc.next_due_date,
52 CASE
53 WHEN vacc.next_due_date < CURRENT_DATE THEN 'OVERDUE'
54 WHEN vacc.next_due_date <= CURRENT_DATE + INTERVAL '14 days' THEN 'Due Soon'
55 ELSE 'Up to Date'
56 END AS status
57FROM Vaccination vacc
58 JOIN Performed_Treatment pt ON vacc.vaccination_id = pt.performed_treatment_id
59 JOIN Medical_Record mr ON pt.medical_record_id = mr.medical_record_id
60 JOIN Pet pet ON mr.pet_id = pet.pet_id
61 JOIN Owner_Pet_Pair opp ON pet.pet_id = opp.pet_id
62 JOIN Vaccination_Vaccine vv ON vacc.vaccination_id = vv.vaccination_id
63 JOIN Vaccine v_info ON vv.vaccine_id = v_info.vaccine_id
64
65WHERE opp.is_primary_owner = TRUE;
66
67
68CREATE VIEW View_Next_Appointments AS
69SELECT opp.owner_id,
70 p.pet_id,
71 p.name AS pet_name,
72 a.appointment_time,
73 a.reason,
74 a.status,
75 er.room_type,
76 vt.veterinarian_id,
77 per_doc.name AS vet_name,
78 per_doc.surname AS vet_surname,
79 vt.specialty
80FROM Appointment a
81 JOIN Pet p ON p.pet_id = a.pet_id
82 JOIN Owner_Pet_Pair opp ON opp.pet_id = p.pet_id
83 LEFT JOIN Exam_Room er ON er.exam_room_id = a.exam_room_id
84 LEFT JOIN Attends at2 ON at2.app_id = a.appointment_id
85 LEFT JOIN Veterinarian vt ON vt.veterinarian_id = at2.medical_prof_id
86 LEFT JOIN Person per_doc ON per_doc.person_id = vt.veterinarian_id
87WHERE a.appointment_time >= CURRENT_TIMESTAMP
88 AND a.status = 'Scheduled'
89ORDER BY a.appointment_time ASC;
90
91
92CREATE VIEW View_Available_Veterinarians AS
93SELECT v.veterinarian_id,
94 per.name,
95 per.surname,
96 v.specialty,
97 mp.shift_type,
98 mp.department,
99 v.license_number
100FROM Veterinarian v
101 JOIN Medical_Professional mp
102 ON mp.medical_prof_id = v.veterinarian_id
103 JOIN Person per
104 ON per.person_id = v.veterinarian_id
105WHERE (
106 (mp.shift_type = 'Morning'
107 AND EXTRACT(HOUR FROM NOW()) BETWEEN 6 AND 12)
108 OR
109 (mp.shift_type = 'Afternoon'
110 AND EXTRACT(HOUR FROM NOW()) BETWEEN 12 AND 20)
111 OR
112 (mp.shift_type = 'Night'
113 AND (
114 EXTRACT(HOUR FROM NOW()) >= 20
115 OR EXTRACT(HOUR FROM NOW()) < 6
116 )
117 )
118 OR
119 (mp.shift_type = 'Full-Day'
120 AND EXTRACT(HOUR FROM NOW()) BETWEEN 8 AND 20)
121 OR
122 (mp.shift_type = 'On-Call')
123 )
124 AND NOT EXISTS (SELECT 1
125 FROM Attends a
126 JOIN Appointment ap
127 ON ap.appointment_id = a.app_id
128 WHERE a.medical_prof_id = v.veterinarian_id
129 AND ap.status = 'Scheduled'
130 AND ap.appointment_time < NOW() + INTERVAL '1 hour'
131 AND ap.appointment_time >= NOW());
132
133
134
135CREATE VIEW View_Free_Upcoming_Slots AS
136SELECT er.exam_room_id,
137 er.room_type,
138 ts.slot_time
139FROM Exam_Room er
140 CROSS JOIN generate_series(
141 NOW(),
142 NOW() + INTERVAL '24 hours',
143 INTERVAL '30 minutes'
144 ) AS ts(slot_time)
145WHERE er.is_available = TRUE
146
147 AND NOT EXISTS (SELECT 1
148 FROM Appointment ap
149 WHERE ap.exam_room_id = er.exam_room_id
150 AND ap.status = 'Scheduled'
151 AND ap.appointment_time < ts.slot_time + INTERVAL '30 minutes'
152 AND ap.appointment_time + INTERVAL '30 minutes' > ts.slot_time)
153
154
155 AND NOT EXISTS (SELECT 1
156 FROM Performed_Treatment pt
157 WHERE pt.exam_room_id = er.exam_room_id
158 AND pt.start_time < ts.slot_time + INTERVAL '30 minutes'
159 AND pt.end_time > ts.slot_time);
160
161
162CREATE VIEW View_Owner_Pet_Treatments AS
163SELECT o.owner_id,
164 pers.name || ' ' || pers.surname AS owner_name,
165 pet.pet_id,
166 pet.name AS pet_name,
167 pet.type_of_animal,
168 t.name AS treatment_name,
169 pt.start_time AS treatment_date,
170 t.price
171FROM Person pers
172 JOIN Owner o ON pers.person_id = o.owner_id
173 JOIN Owner_Pet_Pair opp ON o.owner_id = opp.owner_id
174 JOIN Pet pet ON opp.pet_id = pet.pet_id
175 JOIN Medical_Record mr ON pet.pet_id = mr.pet_id
176 JOIN Performed_Treatment pt ON mr.medical_record_id = pt.medical_record_id
177 JOIN Treatment t ON pt.treatment_id = t.treatment_id
178ORDER BY pt.start_time DESC;
179
180
181CREATE VIEW View_Stock_Health AS
182SELECT pr.product_id,
183 pr.name,
184 pr.manufacturer,
185 pr.stock_quantity,
186 pr.reorder_level,
187 pr.unit_price,
188 pr.stock_quantity * pr.unit_price AS stock_value,
189 CASE
190 WHEN pr.stock_quantity = 0 THEN 'Out of Stock'
191 WHEN pr.stock_quantity <= pr.reorder_level THEN 'Low Stock'
192 WHEN pr.stock_quantity <= pr.reorder_level * 2 THEN 'Medium Stock'
193 ELSE 'Well Stocked'
194 END AS stock_status,
195 CASE
196 WHEN pr.is_prescription_required THEN 'Prescription'
197 WHEN m.medication_id IS NOT NULL THEN 'Medication'
198 WHEN pf.product_id IS NOT NULL THEN 'Pet Food'
199 ELSE 'Other'
200 END AS category,
201 p.name || ' ' || p.surname AS manager_name
202FROM Product pr
203 LEFT JOIN Medication m ON m.medication_id = pr.product_id
204 LEFT JOIN Pet_Food pf ON pf.product_id = pr.product_id
205 JOIN Inventory_Manager im ON im.inventory_manager_id = pr.inventory_manager_id
206 JOIN Person p ON p.person_id = im.inventory_manager_id
207ORDER BY stock_status, stock_value DESC;
208
209
210CREATE VIEW View_Medical_Staff_Dashboard AS
211SELECT mp.medical_prof_id,
212 p.name || ' ' || p.surname AS full_name,
213 mp.department,
214 mp.shift_type,
215 COALESCE(appt.todays_count, 0) AS todays_appointments,
216 COALESCE(tr.active_treatments, 0) AS active_treatments,
217 COALESCE(tr.total_treatments, 0) AS total_treatments_done
218FROM Medical_Professional mp
219JOIN Person p ON mp.medical_prof_id = p.person_id
220
221LEFT JOIN (
222 SELECT a_link.medical_prof_id,
223 COUNT(a.appointment_id) AS todays_count
224 FROM Appointment a
225 JOIN Attends a_link ON a.appointment_id = a_link.app_id
226 WHERE a.appointment_time::DATE = CURRENT_DATE
227 AND a.status = 'Scheduled'
228 GROUP BY a_link.medical_prof_id
229) appt ON appt.medical_prof_id = mp.medical_prof_id
230
231LEFT JOIN (
232 SELECT medical_professional_id,
233 COUNT(CASE WHEN end_time IS NULL THEN 1 END) AS active_treatments,
234 COUNT(*) AS total_treatments
235 FROM Performed_Treatment
236 GROUP BY medical_professional_id
237) tr ON tr.medical_professional_id = mp.medical_prof_id;
238
239
240
241CREATE VIEW View_Owner_Financial_Status AS
242SELECT o.owner_id,
243 p.name || ' ' || p.surname AS owner_name,
244 o.membership_type,
245 o.balance,
246 o.total_spent,
247 CASE
248 WHEN o.balance < 0 THEN 'In debt'
249 WHEN o.balance = 0 THEN 'Settled'
250 ELSE 'Positive'
251 END AS balance_status,
252 CASE
253 WHEN o.membership_type = 'VIP' THEN 'Priority Scheduling + Discount'
254 WHEN o.membership_type = 'Premium' THEN 'Treatment Discount'
255 WHEN o.membership_type = 'Standard' THEN 'No Benefits'
256 ELSE 'No Membership'
257 END AS membership_benefits
258FROM Owner o
259 JOIN Person p ON o.owner_id = p.person_id;