DatabaseCreation: views.sql

File views.sql, 5.1 KB (added by 231056, 6 days ago)
Line 
1CREATE OR REPLACE VIEW vw_customer_notifications AS
2SELECT
3 n.customer_id,
4 n.notification_id,
5 n.title,
6 n.message,
7 n.created_at,
8 n.is_read,
9 n.event_id
10FROM notification n
11ORDER BY n.created_at DESC;
12
13
14CREATE OR REPLACE VIEW vw_customer_purchases AS
15SELECT
16 cust.customer_id,
17 cust.first_name,
18 cust.last_name,
19 e.name AS event_name,
20 e.start_datetime,
21 v.venue_title,
22 s.row_number,
23 s.seat_number,
24 t.ticket_id,
25 t.ticket_price,
26 t.qr_code,
27 p.amount AS paid_amount,
28 p.payment_status,
29 p.payment_date
30FROM customer cust
31JOIN ticket t ON cust.customer_id = t.customer_id
32JOIN event e ON t.event_id = e.event_id
33JOIN venue v ON e.venue_id = v.venue_id
34JOIN seat s ON t.seat_id = s.seat_id
35LEFT JOIN payment p ON t.payment_id = p.payment_id;
36
37
38CREATE OR REPLACE VIEW vw_event_sponsors AS
39SELECT
40 e.event_id,
41 e.name AS event_name,
42 s.sponsor_name,
43 s.contact_email,
44 st.sponsor_type_name,
45 es.sponsorship_amount,
46 es.contract_date
47FROM event e
48JOIN event_sponsorship es ON e.event_id = es.event_id
49JOIN sponsor s ON es.sponsor_id = s.sponsor_id
50JOIN sponsor_type st ON s.sponsor_type_id = st.sponsor_type_id;
51
52
53CREATE OR REPLACE VIEW vw_admin_roles AS
54SELECT
55 a.admin_id,
56 a.first_name,
57 a.last_name,
58 a.email,
59 CASE
60 WHEN ea.admin_id IS NOT NULL AND ta.admin_id IS NOT NULL THEN 'EVENT & TICKET ADMIN'
61 WHEN ea.admin_id IS NOT NULL THEN 'EVENT_ADMIN'
62 WHEN ta.admin_id IS NOT NULL THEN 'TICKET_ADMIN'
63 ELSE 'NO_ROLE'
64 END AS role
65FROM admin a
66LEFT JOIN event_admin ea ON a.admin_id = ea.admin_id
67LEFT JOIN ticket_admin ta ON a.admin_id = ta.admin_id;
68
69
70
71CREATE OR REPLACE VIEW vw_event_details AS
72SELECT
73 e.event_id,
74 e.name AS event_name,
75 e.description,
76 e.start_datetime,
77 e.end_datetime,
78 e.status,
79 v.venue_title,
80 v.street_address,
81 c.city_name,
82 co.country_name,
83 cat.category_name,
84 (SELECT em.url FROM event_media em WHERE em.event_id = e.event_id LIMIT 1) AS event_image_url
85FROM event e
86JOIN venue v ON e.venue_id = v.venue_id
87JOIN city c ON v.city_id = c.city_id
88JOIN country co ON c.country_id = co.country_id
89JOIN category cat ON e.category_id = cat.category_id;
90
91
92CREATE OR REPLACE VIEW vw_customer_profile_stats AS
93SELECT
94 c.customer_id,
95 c.first_name,
96 c.last_name,
97 c.email,
98
99 (SELECT COUNT(*) FROM ticket t
100 WHERE t.customer_id = c.customer_id AND t.status IN ('PURCHASED', 'SCANNED')) AS total_tickets,
101
102 (SELECT COUNT(DISTINCT t.event_id) FROM ticket t
103 WHERE t.customer_id = c.customer_id AND t.status IN ('PURCHASED', 'SCANNED')) AS unique_events_attended,
104
105 (SELECT COUNT(*) FROM notification n
106 WHERE n.customer_id = c.customer_id AND n.is_read = FALSE) AS unread_notifications,
107
108 CASE
109 WHEN (SELECT COUNT(*) FROM ticket t WHERE t.customer_id = c.customer_id AND t.status = 'PURCHASED') > 10 THEN 'PLATINUM FAN'
110 WHEN (SELECT COUNT(*) FROM ticket t WHERE t.customer_id = c.customer_id AND t.status = 'PURCHASED') > 5 THEN 'GOLD FAN'
111 ELSE 'STANDARD MEMBER'
112 END AS loyalty_status,
113
114 (SELECT MAX(p.payment_date) FROM payment p WHERE p.customer_id = c.customer_id) AS last_activity
115FROM customer c;
116
117
118CREATE VIEW vw_event_revenue AS
119SELECT
120 e.event_id,
121 e.name,
122 SUM(p.amount) AS total_revenue
123FROM event e
124JOIN ticket t ON e.event_id = t.event_id
125JOIN payment p ON t.payment_id = p.payment_id
126WHERE p.payment_status = 'COMPLETED'
127GROUP BY e.event_id, e.name;
128
129
130CREATE OR REPLACE VIEW vw_event_archive AS
131SELECT
132 e.event_id,
133 e.name AS event_name,
134 e.end_datetime,
135 cat.category_name,
136 ROUND(AVG(r.rating), 2) AS avg_rating,
137 COUNT(r.review_id) AS total_reviews
138FROM event e
139JOIN category cat ON e.category_id = cat.category_id
140JOIN review r ON e.event_id = r.event_id
141WHERE e.status = 'COMPLETED'
142GROUP BY e.event_id, e.name, e.end_datetime, cat.category_name;
143
144
145CREATE OR REPLACE VIEW vw_event_ticket_master_report AS
146SELECT
147 e.event_id,
148 e.name AS event_name,
149 v.venue_title,
150 v.capacity AS venue_capacity,
151 COUNT(t.ticket_id) AS total_generated_tickets,
152
153 COUNT(*) FILTER (WHERE t.status = 'AVAILABLE') AS available_tickets,
154
155 COUNT(*) FILTER (WHERE t.status IN ('PURCHASED', 'SCANNED')) AS total_sold_tickets,
156
157 COUNT(*) FILTER (WHERE t.status = 'RESERVED') AS currently_reserved,
158
159 COUNT(*) FILTER (WHERE t.status = 'SCANNED') AS actual_attendance,
160
161 CASE
162 WHEN v.capacity > 0 THEN
163 ROUND((COUNT(*) FILTER (WHERE t.status IN ('PURCHASED', 'SCANNED'))::NUMERIC / v.capacity) * 100, 2)
164 ELSE 0
165 END AS sales_occupancy_percent
166
167FROM event e
168JOIN venue v ON e.venue_id = v.venue_id
169LEFT JOIN ticket t ON e.event_id = t.event_id
170GROUP BY e.event_id, e.name, v.venue_title, v.capacity;