DatabaseCreation: views.sql

File views.sql, 14.0 KB (added by 231070, 17 hours ago)
Line 
1----------------------------- View 1: view_events_by_date -----------------------------
2-- Home page со идни настани
3CREATE VIEW view_events_by_date AS
4SELECT
5 e.id,
6 e.title,
7 e.start_date,
8 e.end_date,
9 MIN(ei.image_url) AS image
10FROM EVENT e
11LEFT JOIN EVENT_IMAGE ei ON ei.EVENTid = e.id
12WHERE e.start_date >= CURRENT_DATE
13GROUP BY e.id, e.title, e.start_date, e.end_date
14ORDER BY e.start_date ASC;
15
16SELECT *
17FROM view_events_by_date
18WHERE id = 12455;
19
20-- Погледот ги прикажува сите идни настани подредени по датум со по една слика за секој настан.
21-- Се користи на почетната страница на апликацијата и
22-- ја имплементира бизнис логиката за приказ на листа на достапни настани.
23
24
25----------------------------- View 2: view_event_details -----------------------------
26-- Детали за избран конкретен настан
27CREATE VIEW view_event_details AS
28SELECT
29 e.id,
30 e.title,
31 e.description,
32 e.start_date,
33 e.end_date,
34 e.end_date - e.start_date AS duration_days,
35 c.category_name AS category,
36 ARRAY_AGG(DISTINCT ei.image_url) FILTER (WHERE ei.image_url IS NOT NULL) AS images
37FROM EVENT e
38LEFT JOIN CATEGORIZATION c ON e.CATEGORIZATIONid = c.id
39LEFT JOIN EVENT_IMAGE ei ON e.id = ei.EVENTid
40GROUP BY e.id, e.title, e.start_date, e.end_date, c.category_name ;
41
42SELECT *
43FROM view_event_details
44WHERE id=56984;
45
46-- Погледот ги прикажува деталите за конкретен настан —
47-- наслов, опис, датуми, траење, категорија и сите слики.
48-- Се користи на страницата за детали на настан кога корисникот ќе кликне на конкретен настан и
49-- ја имплементира бизнис логиката за приказ на комплетни информации за настанот.
50
51
52----------------------------- View 3: view_event_halls -----------------------------
53-- Пред да се купи тикет, преглед на сала и venues за настанот
54CREATE VIEW view_event_halls AS
55SELECT
56 e.id AS event_id,
57 e.title,
58 h.id AS hall_id,
59 h.hall_name AS hall_name,
60 h.capacity,
61 eh.allowed_access,
62 v.venue_name AS venue_name,
63 v.city
64FROM EVENT e
65JOIN EVENT_HALL eh ON eh.EVENTid = e.id
66JOIN HALL h ON h.id = eh.HALLid
67JOIN VENUE v ON v.id = h.VENUEid;
68
69SELECT *
70FROM view_event_halls
71WHERE event_id = 12356;
72
73-- Погледот ги прикажува сите сали и venues за даден настан заедно со
74-- нивниот капацитет и дозволен пристап.
75-- Се користи при процесот на купување тикет кога корисникот треба да избере сала и
76-- ја имплементира бизнис логиката за приказ на достапни локации за настанот.
77
78
79----------------------------- View 4: view_event_ticket_availability -----------------------------
80-- Преглед на типови на тикети, цени и количини за веќе избрана сала
81CREATE VIEW view_event_ticket_availability AS
82SELECT
83 e.id AS event_id,
84 tt.id AS ticket_type_id,
85 tt.type_name AS ticket_type,
86 ett.price,
87 ett.quantity_available,
88 COUNT(DISTINCT t.id) FILTER (WHERE t.status = 'ACTIVE') AS sold,
89 ett.quantity_available - COUNT(DISTINCT t.id) FILTER (WHERE t.status = 'ACTIVE') AS remaining
90FROM EVENT e
91JOIN EVENT_TICKET_TYPE ett ON ett.EVENTid = e.id
92JOIN TICKET_TYPE tt ON tt.id = ett.TICKET_TYPEid
93LEFT JOIN TICKET t ON t.EVENTid = e.id AND t.TICKET_TYPEid = tt.id
94GROUP BY e.id, tt.id, tt.type_name , ett.price, ett.quantity_available;
95
96SELECT *
97FROM view_event_ticket_availability
98WHERE event_id = 12455;
99
100-- Погледот ги прикажува достапните типови на тикети за даден настан заедно со
101-- нивните цени, вкупен број, продадени и преостанати количини.
102-- Се користи при купување тикет по избор на сала и
103-- ја имплементира бизнис логиката за приказ на достапност на тикети во реално време.
104
105
106----------------------------- View 5: view_ticket_status -----------------------------
107-- Преглед на детали за тикет
108CREATE VIEW view_ticket_status AS
109SELECT
110 t.id AS ticket_id,
111 t.code,
112 t.status,
113 e.title AS event_title,
114 e.start_date,
115 h.hall_name AS hall_name,
116 CASE
117 WHEN s.seat_number IS NULL THEN 'N/A'
118 ELSE s.seat_number::TEXT
119 END AS seat_number,
120 tt.type_name AS ticket_type,
121 u.first_name || ' ' || u.last_name AS holder_name
122FROM TICKET t
123JOIN EVENT e ON t.EVENTid = e.id
124JOIN HALL h ON t.HALLid = h.id
125JOIN TICKET_TYPE tt ON t.TICKET_TYPEid = tt.id
126JOIN APP_USER u ON t.APP_USERid = u.id
127LEFT JOIN SEAT s ON t.SEATid = s.id;
128
129SELECT *
130FROM view_ticket_status
131WHERE ticket_id = 3;
132
133-- Погледот ги прикажува деталите за конкретен тикет —
134-- статус, настан, сала, седиште, тип и корисник. Се користи при преглед на тикет
135-- од страна на корисникот и при скенирање на тикет при влез на настан и
136-- ја имплементира бизнис логиката за верификација и приказ на тикети.
137
138
139----------------------------- View 6: view_event_reviews -----------------------------
140-- Приказ на рецензии и оценки за минат настан
141CREATE OR REPLACE VIEW view_event_reviews AS
142SELECT
143 e.id AS event_id,
144 e.title AS event_title,
145 e.start_date AS start_date,
146 r.id AS review_id,
147 CASE
148 WHEN u.first_name IS NULL THEN 'Anonymous'
149 ELSE u.first_name || ' ' || u.last_name
150 END
151 AS user_name,
152 r.rating,
153 r.review_comment
154FROM EVENT e
155LEFT JOIN REVIEW r ON r.EVENTid = e.id
156LEFT JOIN APP_USER u ON u.id = r.APP_USERid;
157
158SELECT *
159FROM view_event_reviews
160WHERE event_id = 12345;
161
162-- Погледот ги прикажува сите рецензии и оценки за даден минат настан
163-- со прикажување на Anonymous за анонимни рецензии.
164-- Се користи на страницата на настанот по неговото завршување и
165-- ја имплементира бизнис логиката за систем на оценување и рецензии.
166
167
168----------------------------- View 7: view_user_order_summary -----------------------------
169-- Преглед на историја на нарачки по корисник
170CREATE VIEW view_user_order_summary AS
171SELECT
172 uo.id AS order_id,
173 u.id AS user_id,
174 u.first_name || ' ' || u.last_name AS customer_name,
175 uo.order_date,
176 uo.total_amount,
177 s.status_name AS order_status,
178 pc.code AS promo_code,
179 pc.discount_percent,
180 ps.paid_amount,
181 ps.payment_status,
182 ps.payment_method,
183 ts.ticket_count
184FROM USER_ORDER uo
185JOIN APP_USER u ON u.id = uo.APP_USERid
186JOIN STATUS s ON s.id = uo.STATUSid
187LEFT JOIN PROMO_CODE pc ON pc.id = uo.PROMO_CODEid
188LEFT JOIN (
189 SELECT user_orderid, COUNT(*) AS ticket_count
190 FROM ticket
191 GROUP BY user_orderid
192) ts ON ts.user_orderid = uo.id
193LEFT JOIN (
194 SELECT
195 p.user_orderid,
196 SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS paid_amount,
197 MAX(p.status) AS payment_status,
198 MAX(pm.method_name) AS payment_method
199 FROM payment p
200 LEFT JOIN payment_method pm ON pm.id = p.payment_methodid
201 GROUP BY p.user_orderid
202) ps ON ps.user_orderid = uo.id;
203
204SELECT * FROM view_user_order_summary WHERE user_id = 25679;
205
206
207-- Оригиналната верзија на погледот користеше subqueries кои ги
208-- агрегираа сите редови од табелите TICKET и PAYMENT пред да ги филтрираат,
209-- што резултираше со бавно извршување. Поради тоа прашалникот беше преуреден.
210
211----------------------------- Преуреден View 7 -----------------------------
212CREATE OR REPLACE VIEW view_user_order_summary AS
213SELECT
214 uo.id AS order_id,
215 u.id AS user_id,
216 u.first_name || ' ' || u.last_name AS customer_name,
217 uo.order_date,
218 uo.total_amount,
219 s.status_name AS order_status,
220 pc.code AS promo_code,
221 pc.discount_percent,
222 SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS paid_amount,
223 MAX(p.status) AS payment_status,
224 MAX(pm.method_name) AS payment_method,
225 COUNT(DISTINCT t.id) AS ticket_count
226FROM USER_ORDER uo
227JOIN APP_USER u ON u.id = uo.APP_USERid
228JOIN STATUS s ON s.id = uo.STATUSid
229LEFT JOIN PROMO_CODE pc ON pc.id = uo.PROMO_CODEid
230LEFT JOIN PAYMENT p ON p.user_orderid = uo.id
231LEFT JOIN PAYMENT_METHOD pm ON pm.id = p.payment_methodid
232LEFT JOIN TICKET t ON t.user_orderid = uo.id
233GROUP BY uo.id, u.id, u.first_name, u.last_name,
234 uo.order_date, uo.total_amount, s.status_name,
235 pc.code, pc.discount_percent;
236
237SELECT * FROM view_user_order_summary WHERE user_id = 25679;
238
239-- Погледот ја прикажува целосната историја на нарачки за даден корисник — нарачки,
240-- плаќања, тикети и промо кодови. Се користи на страницата на профилот на корисникот и
241-- ја имплементира бизнис логиката за преглед на историја на купувања.
242
243
244----------------------------- View 8: view_user_subscriptions_feed -----------------------------
245-- Приказ на настани само категориите на кои е претплатен корисникот
246CREATE VIEW view_user_subscriptions_feed AS
247SELECT
248 u.id AS user_id,
249 u.email,
250 e.id AS event_id,
251 e.title AS event_title,
252 e.start_date,
253 c.category_name AS category,
254 sub.subcategory_name AS subcategory,
255 'CATEGORY' AS subscription_type
256FROM APP_USER u
257JOIN USER_CATEGORY_SUBSCRIPTION ucs ON ucs.APP_USERid = u.id
258JOIN CATEGORIZATION c ON c.id = ucs.CATEGORIZATIONid
259JOIN EVENT e ON e.CATEGORIZATIONid = c.id
260LEFT JOIN SUBCATEGORY sub ON sub.id = e.SUBCATEGORYid
261WHERE e.start_date >= CURRENT_DATE
262
263UNION
264
265SELECT
266 u.id AS user_id,
267 u.email,
268 e.id AS event_id,
269 e.title AS event_title,
270 e.start_date,
271 c.category_name AS category,
272 sub.subcategory_name AS subcategory,
273 'SUBCATEGORY' AS subscription_type
274FROM APP_USER u
275JOIN USER_SUBCATEGORY_SUBSCRIPTION uss ON uss.APP_USERid = u.id
276JOIN SUBCATEGORY sub ON sub.id = uss.SUBCATEGORYid
277JOIN CATEGORIZATION c ON c.id = sub.CATEGORIZATIONid
278JOIN EVENT e ON e.SUBCATEGORYid = sub.id
279WHERE e.start_date >= CURRENT_DATE;
280
281SELECT *
282FROM view_user_subscriptions_feed
283WHERE user_id=24589;
284
285-- Погледот ги прикажува само идните настани од категориите и подкатегориите
286-- на кои е претплатен корисникот, комбинирајќи ги двата типа на претплати преку UNION.
287-- Се користи на персонализираниот feed на корисникот и
288-- ја имплементира бизнис логиката за приказ на релевантни настани според интересите на корисникот.
289
290
291----------------------------- View 9: view_event_sales_report -----------------------------
292-- Финансиски извештај по настан (приходи, рефундации, пополнетост)
293CREATE VIEW view_event_sales_report AS
294SELECT
295 e.id AS event_id,
296 e.title,
297 e.start_date,
298 c.category_name AS category,
299 COUNT(t.id) FILTER (WHERE t.status = 'ACTIVE') AS active_tickets,
300 COUNT(t.id) FILTER (WHERE t.status = 'CANCELLED') AS cancelled_tickets,
301 SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') AS total_revenue,
302 SUM(rf.amount) FILTER (WHERE rf.status = 'APPROVED') AS total_refunded,
303 SUM(p.amount) FILTER (WHERE p.status = 'COMPLETED') -
304 SUM(rf.amount) FILTER (WHERE rf.status = 'APPROVED') AS net_revenue,
305 SUM(h.capacity) AS total_capacity,
306 ROUND(COUNT(t.id) FILTER (WHERE t.status = 'ACTIVE') * 100.0 /
307 NULLIF(SUM(h.capacity), 0), 2) AS occupancy_percent
308FROM EVENT e
309LEFT JOIN CATEGORIZATION c ON c.id = e.CATEGORIZATIONid
310LEFT JOIN TICKET t ON t.EVENTid = e.id
311LEFT JOIN USER_ORDER uo ON uo.id = t.USER_ORDERid
312LEFT JOIN PAYMENT p ON p.USER_ORDERid = uo.id
313LEFT JOIN REFUND rf ON rf.PAYMENTid = p.id
314LEFT JOIN EVENT_HALL eh ON eh.EVENTid = e.id
315LEFT JOIN HALL h ON h.id = eh.HALLid
316GROUP BY e.id, e.title, e.start_date, c.category_name;
317
318SELECT *
319FROM view_event_sales_report
320WHERE event_id = 12455;
321
322-- Погледот прикажува комплетен финансиски извештај за даден настан — активни
323-- и откажани тикети, вкупен приход, рефундации, нето приход и процент на пополнетост.
324-- Се користи од страна на организаторите и администраторите за анализа на успешноста на настанот и
325-- ја имплементира бизнис логиката за финансиско известување.