| 1 | CREATE VIEW View_Low_Stock_Products AS
|
|---|
| 2 | SELECT product_id,
|
|---|
| 3 | name,
|
|---|
| 4 | stock_quantity,
|
|---|
| 5 | reorder_level
|
|---|
| 6 | FROM Product
|
|---|
| 7 | WHERE stock_quantity <= reorder_level;
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 | CREATE VIEW View_Treatment_Revenue_Summary AS
|
|---|
| 11 | SELECT 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
|
|---|
| 15 | FROM Treatment t
|
|---|
| 16 | JOIN Performed_Treatment pt ON t.treatment_id = pt.treatment_id
|
|---|
| 17 | GROUP BY t.name
|
|---|
| 18 | ORDER BY total_revenue DESC;
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 | CREATE VIEW View_Review_Stats AS
|
|---|
| 22 | SELECT owner_id,
|
|---|
| 23 | ROUND(AVG(rating), 2) AS average_rating,
|
|---|
| 24 | COUNT(comment) AS total_comments,
|
|---|
| 25 | AVG(LENGTH(comment)) AS avg_comment_length
|
|---|
| 26 | FROM Review
|
|---|
| 27 | GROUP BY owner_id;
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 | CREATE VIEW View_Pet_Owners AS
|
|---|
| 31 | SELECT 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
|
|---|
| 39 | FROM 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 |
|
|---|
| 45 | CREATE VIEW View_Pet_Vaccination_Status AS
|
|---|
| 46 | SELECT 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
|
|---|
| 57 | FROM 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 |
|
|---|
| 65 | WHERE opp.is_primary_owner = TRUE;
|
|---|
| 66 |
|
|---|
| 67 |
|
|---|
| 68 | CREATE VIEW View_Next_Appointments AS
|
|---|
| 69 | SELECT 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
|
|---|
| 80 | FROM 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
|
|---|
| 87 | WHERE a.appointment_time >= CURRENT_TIMESTAMP
|
|---|
| 88 | AND a.status = 'Scheduled'
|
|---|
| 89 | ORDER BY a.appointment_time ASC;
|
|---|
| 90 |
|
|---|
| 91 |
|
|---|
| 92 | CREATE VIEW View_Available_Veterinarians AS
|
|---|
| 93 | SELECT v.veterinarian_id,
|
|---|
| 94 | per.name,
|
|---|
| 95 | per.surname,
|
|---|
| 96 | v.specialty,
|
|---|
| 97 | mp.shift_type,
|
|---|
| 98 | mp.department,
|
|---|
| 99 | v.license_number
|
|---|
| 100 | FROM 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
|
|---|
| 105 | WHERE (
|
|---|
| 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 |
|
|---|
| 135 | CREATE VIEW View_Free_Upcoming_Slots AS
|
|---|
| 136 | SELECT er.exam_room_id,
|
|---|
| 137 | er.room_type,
|
|---|
| 138 | ts.slot_time
|
|---|
| 139 | FROM Exam_Room er
|
|---|
| 140 | CROSS JOIN generate_series(
|
|---|
| 141 | NOW(),
|
|---|
| 142 | NOW() + INTERVAL '24 hours',
|
|---|
| 143 | INTERVAL '30 minutes'
|
|---|
| 144 | ) AS ts(slot_time)
|
|---|
| 145 | WHERE 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 |
|
|---|
| 162 | CREATE VIEW View_Owner_Pet_Treatments AS
|
|---|
| 163 | SELECT 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
|
|---|
| 171 | FROM 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
|
|---|
| 178 | ORDER BY pt.start_time DESC;
|
|---|
| 179 |
|
|---|
| 180 |
|
|---|
| 181 | CREATE VIEW View_Stock_Health AS
|
|---|
| 182 | SELECT 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
|
|---|
| 202 | FROM 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
|
|---|
| 207 | ORDER BY stock_status, stock_value DESC;
|
|---|
| 208 |
|
|---|
| 209 |
|
|---|
| 210 | CREATE VIEW View_Medical_Staff_Dashboard AS
|
|---|
| 211 | SELECT 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
|
|---|
| 218 | FROM Medical_Professional mp
|
|---|
| 219 | JOIN Person p ON mp.medical_prof_id = p.person_id
|
|---|
| 220 |
|
|---|
| 221 | LEFT 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 |
|
|---|
| 231 | LEFT 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 |
|
|---|
| 241 | CREATE VIEW View_Owner_Financial_Status AS
|
|---|
| 242 | SELECT 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
|
|---|
| 258 | FROM Owner o
|
|---|
| 259 | JOIN Person p ON o.owner_id = p.person_id; |
|---|