DatabaseCreation: views.sql

File views.sql, 11.2 KB (added by 231169, 8 days ago)
Line 
1--======
2--1 active product catalog +
3--======
4SET search_path TO myschema;
5DROP VIEW IF EXISTS v_active_product_catalog;
6
7CREATE VIEW v_active_product_catalog AS
8SELECT
9 v.variant_id,
10 v.sku,
11 p.name AS product_name,
12 p.brand,
13 c.category_name,
14 prof.first_name || ' ' || prof.last_name AS seller_name,
15 SUM(ii.quantity) AS seller_stock,
16 v.price,
17 STRING_AGG(DISTINCT wh.location, ', ') AS available_in_cities,
18 CASE
19 WHEN SUM(ii.quantity) >= 10 THEN 'IN_STOCK'
20 WHEN SUM(ii.quantity) > 0 THEN 'LOW_STOCK'
21 ELSE 'OUT_OF_STOCK'
22 END AS stock_status
23FROM product_variants v
24JOIN products p ON v.product_id = p.product_id
25JOIN categories c ON p.category_id = c.category_id
26JOIN inventory_items ii ON v.variant_id = ii.variant_id
27JOIN warehouses wh ON ii.warehouse_id = wh.warehouse_id
28JOIN user_profiles prof ON wh.user_id = prof.user_id
29WHERE ii.quantity > 0
30GROUP BY
31 v.variant_id,
32 v.sku,
33 p.name,
34 p.brand,
35 c.category_name,
36 prof.user_id,
37 prof.first_name,
38 prof.last_name,
39 v.price
40ORDER BY
41 p.name,
42 seller_name;
43
44--======
45--2 order command center full +
46--======
47DROP VIEW IF EXISTS v_order_command_center_full;
48
49CREATE VIEW v_order_command_center_full AS
50SELECT
51 o.order_id,
52 o.status AS order_status,
53 o.order_date,
54 cp.first_name || ' ' || cp.last_name AS customer_name,
55 cu.email AS customer_email,
56 o.total_amount AS order_total,
57 sm.method_name AS shipping_via,
58 a.city || ', ' || a.street_address AS delivery_destination,
59 s.tracking_number,
60 s.status AS shipment_status,
61 cour_p.first_name || ' ' || cour_p.last_name AS assigned_courier,
62 (SELECT string_agg(p.name || ' (Qty: ' || oi.quantity || ')', ', ')
63 FROM ORDER_ITEMS oi
64 JOIN PRODUCT_VARIANTS v ON oi.variant_id = v.variant_id
65 JOIN PRODUCTS p ON v.product_id = p.product_id
66 WHERE oi.order_id = o.order_id) AS items_ordered
67FROM ORDERS o
68JOIN USERS cu ON o.user_id = cu.user_id
69JOIN USER_PROFILES cp ON cu.user_id = cp.user_id
70JOIN SHIPPING_METHODS sm ON o.shipping_method_id = sm.method_id
71JOIN ADDRESSES a ON o.user_id = a.user_id AND a.is_default = true
72LEFT JOIN SHIPMENTS s ON o.order_id = s.order_id
73LEFT JOIN USER_PROFILES cour_p ON s.courier_id = cour_p.user_id
74WHERE o.status <> 'CART';
75
76--======
77--3 seller items fulfillment +
78--======
79DROP VIEW IF EXISTS v_seller_item_fulfillment;
80
81CREATE OR REPLACE VIEW v_seller_item_fulfillment AS
82SELECT
83 seller_p.user_id AS seller_id,
84 seller_p.first_name AS seller_store_name,
85 wh.warehouse_name AS pickup_location,
86
87 m.name AS product_brand,
88
89 o.order_id,
90 o.order_date,
91 cust_p.first_name || ' ' || cust_p.last_name AS customer_name,
92
93 p.name AS product_name,
94 v.sku,
95 oi.quantity,
96 oi.unit_price,
97 (oi.quantity * oi.unit_price)::numeric(12,2) AS item_total_revenue,
98
99 s.status AS shipment_status,
100 cour_p.first_name AS courier_service
101FROM ORDER_ITEMS oi
102JOIN PRODUCT_VARIANTS v ON oi.variant_id = v.variant_id
103JOIN PRODUCTS p ON v.product_id = p.product_id
104JOIN MANUFACTURERS m ON v.manufacturer_id = m.manufacturer_id
105JOIN ORDERS o ON oi.order_id = o.order_id
106JOIN USER_PROFILES cust_p ON o.user_id = cust_p.user_id
107
108LEFT JOIN SHIPMENT_ITEMS si ON oi.order_item_id = si.order_item_id
109LEFT JOIN PRODUCT_INSTANCES pi ON si.instance_id = pi.instance_id
110LEFT JOIN WAREHOUSES wh ON pi.warehouse_id = wh.warehouse_id
111LEFT JOIN USER_PROFILES seller_p ON wh.user_id = seller_p.user_id
112
113LEFT JOIN SHIPMENTS s ON o.order_id = s.order_id
114LEFT JOIN USER_PROFILES cour_p ON s.courier_id = cour_p.user_id
115
116WHERE o.status NOT IN ('CART', 'CANCELLED');
117
118--======
119--4 product selection matrix +
120--======
121DROP VIEW IF EXISTS v_product_selection_matrix;
122
123CREATE VIEW v_product_selection_matrix AS
124SELECT
125 p.product_id,
126 p.name AS product_model,
127 v.variant_id,
128 v.sku,
129 v.price,
130 v.stock_total,
131 (SELECT string_agg(pa.attribute_name || ': ' || av.attr_value, ', ')
132 FROM PRODUCT_ATTRIBUTE_VALUES av
133 JOIN PRODUCT_ATTRIBUTES pa ON av.attribute_id = pa.attribute_id
134 WHERE av.variant_id = v.variant_id) AS selection_specs,
135 v.product_variant_picture_url AS image_url
136FROM PRODUCTS p
137JOIN PRODUCT_VARIANTS v ON p.product_id = v.product_id
138WHERE v.stock_total > 0
139ORDER BY p.name, v.price ASC;
140
141--======
142--5 product average rating +
143--======
144DROP VIEW IF EXISTS v_product_ratings_avg;
145
146CREATE VIEW v_product_ratings_avg AS
147SELECT
148 p.product_id,
149 p.name AS product_name,
150 ROUND(AVG(r.rating), 2) AS average_rating,
151 COUNT(r.review_id) AS total_reviews,
152 MIN(r.rating) AS worst_rating,
153 MAX(r.rating) AS best_rating
154FROM PRODUCTS p
155LEFT JOIN REVIEWS r ON p.product_id = r.product_id
156GROUP BY p.product_id, p.name;
157
158--======
159--6 monthly sales report +
160--======
161DROP VIEW IF EXISTS v_monthly_sales_report;
162
163CREATE VIEW v_monthly_sales_report AS
164SELECT
165 TO_CHAR(order_date, 'YYYY-MM') AS sales_month,
166 COUNT(order_id) AS total_orders,
167 SUM(total_amount) AS gross_revenue,
168 ROUND(AVG(total_amount), 2) AS average_order_value
169FROM ORDERS
170WHERE status IN ('PAID', 'SHIPPED', 'COMPLETED')
171GROUP BY sales_month
172ORDER BY sales_month DESC;
173
174--======
175--7 seller revenue report +
176--======
177DROP VIEW IF EXISTS v_seller_revenue_report;
178
179CREATE VIEW v_seller_revenue_report AS
180SELECT
181 prof.user_id AS seller_id,
182 prof.first_name AS seller_name,
183 COUNT(DISTINCT o.order_id) AS successful_orders_count,
184 COUNT(si.shipment_item_id) AS total_items_sold,
185 SUM(oi.unit_price)::numeric(14,2) AS total_gross_revenue,
186 ROUND(AVG(oi.unit_price), 2) AS avg_item_price,
187 COUNT(DISTINCT p.product_id) AS unique_products_sold
188FROM user_profiles prof
189JOIN warehouses wh ON prof.user_id = wh.user_id
190JOIN product_instances pi ON wh.warehouse_id = pi.warehouse_id
191JOIN shipment_items si ON pi.instance_id = si.instance_id
192JOIN order_items oi ON si.order_item_id = oi.order_item_id
193JOIN orders o ON oi.order_id = o.order_id
194JOIN product_variants v ON oi.variant_id = v.variant_id
195JOIN products p ON v.product_id = p.product_id
196WHERE o.status IN ('PAID', 'SHIPPED', 'COMPLETED')
197GROUP BY prof.user_id, prof.first_name
198ORDER BY total_gross_revenue DESC;
199
200--======
201--8 active warranties -
202--======
203DROP VIEW IF EXISTS v_active_warranty_tracker;
204CREATE VIEW v_active_warranty_tracker AS
205SELECT
206 u.email AS customer_email,
207 prof.first_name || ' ' || prof.last_name AS customer_name,
208 p.name AS product_name,
209 pi.serial_number,
210 o.order_date AS purchase_date,
211 w.duration_months,
212 (o.order_date + (w.duration_months || ' months')::interval)::date AS warranty_expiry_date,
213 CASE
214 WHEN (o.order_date + (w.duration_months || ' months')::interval) > NOW() THEN 'ACTIVE'
215 ELSE 'EXPIRED'
216 END AS warranty_status
217FROM warranties w
218JOIN product_instances pi ON w.instance_id = pi.instance_id
219JOIN shipment_items si ON pi.instance_id = si.instance_id
220JOIN order_items oi ON si.order_item_id = oi.order_item_id
221JOIN orders o ON oi.order_id = o.order_id
222JOIN users u ON o.user_id = u.user_id
223JOIN user_profiles prof ON u.user_id = prof.user_id
224JOIN product_variants v ON pi.variant_id = v.variant_id
225JOIN products p ON v.product_id = p.product_id;
226
227--======
228--9 inventory drift sync report +
229--======
230DROP VIEW IF EXISTS v_inventory_drift_sync_report;
231CREATE VIEW v_inventory_drift_sync_report AS
232WITH instance_counts AS (
233 SELECT variant_id, COUNT(*) AS physical_available_count
234 FROM product_instances
235 WHERE status = 'AVAILABLE'
236 GROUP BY variant_id
237),
238warehouse_sums AS (
239 SELECT variant_id, SUM(quantity) AS inventory_stock
240 FROM inventory_items
241 GROUP BY variant_id
242)
243SELECT
244 v.variant_id,
245 p.name AS product_name,
246 v.sku,
247 v.stock_total AS master_stock,
248 COALESCE(w.inventory_stock, 0) AS aggregate_inventory_stock,
249 COALESCE(ic.physical_available_count, 0) AS available_physical_instances,
250 v.stock_total - COALESCE(w.inventory_stock, 0) AS master_vs_inventory_drift,
251 COALESCE(w.inventory_stock, 0) - COALESCE(ic.physical_available_count, 0) AS inventory_vs_instance_drift
252FROM product_variants v
253JOIN products p ON v.product_id = p.product_id
254LEFT JOIN warehouse_sums w ON v.variant_id = w.variant_id
255LEFT JOIN instance_counts ic ON v.variant_id = ic.variant_id;
256
257--======
258--10 cart value view because CART.total_amount must remain NULL
259--======
260DROP VIEW IF EXISTS v_cart_current_value;
261CREATE VIEW v_cart_current_value AS
262SELECT
263 o.order_id,
264 o.user_id,
265 COUNT(oi.order_item_id) AS cart_item_rows,
266 SUM(oi.quantity) AS cart_total_units,
267 SUM(oi.quantity * oi.unit_price)::numeric(12,2) AS cart_current_value
268FROM orders o
269JOIN order_items oi ON oi.order_id = o.order_id
270WHERE o.status = 'CART'
271GROUP BY o.order_id, o.user_id;
272
273--======
274--11 derived fulfillment status for each order item.
275--======
276DROP VIEW IF EXISTS v_order_item_fulfillment_status;
277CREATE VIEW v_order_item_fulfillment_status AS
278SELECT
279 oi.order_item_id,
280 oi.order_id,
281 oi.variant_id,
282 oi.quantity AS ordered_quantity,
283 COUNT(si.shipment_item_id)::int AS shipped_quantity,
284 (oi.quantity - COUNT(si.shipment_item_id))::int AS missing_quantity,
285 CASE
286 WHEN COUNT(si.shipment_item_id) = 0 THEN 'NOT_SHIPPED'
287 WHEN COUNT(si.shipment_item_id) < oi.quantity THEN 'PARTIALLY_SHIPPED'
288 ELSE 'FULLY_SHIPPED'
289 END AS fulfillment_status
290FROM order_items oi
291LEFT JOIN shipment_items si ON si.order_item_id = oi.order_item_id
292GROUP BY oi.order_item_id, oi.order_id, oi.variant_id, oi.quantity;
293
294--======
295--12 shipment + main payment summary through order_id.
296--======
297DROP VIEW IF EXISTS v_shipment_payment_summary;
298CREATE VIEW v_shipment_payment_summary AS
299SELECT
300 s.shipment_id,
301 s.order_id,
302 s.status AS shipment_status,
303 s.tracking_number,
304 s.shipped_date,
305 s.estimated_arrival,
306 s.delivered_date,
307 s.courier_id,
308 p.payment_id,
309 p.payment_method,
310 p.amount AS payment_amount,
311 p.payment_status,
312 p.payment_date
313FROM shipments s
314LEFT JOIN payments p ON p.order_id = s.order_id
315 AND p.transaction_id = 'TXN-' || s.order_id || '-MAIN';
316
317--======
318--13 customer items for delivery +
319--======
320DROP VIEW IF EXISTS v_customer_order_tracking;
321
322CREATE VIEW v_customer_order_tracking AS
323SELECT
324 o.user_id AS customer_id,
325 o.order_id,
326 o.order_date,
327 o.status AS order_status,
328 o.total_amount,
329
330 (
331 SELECT string_agg(p.name || ' (x' || oi.quantity || ')', ', ')
332 FROM order_items oi
333 JOIN product_variants v ON oi.variant_id = v.variant_id
334 JOIN products p ON v.product_id = p.product_id
335 WHERE oi.order_id = o.order_id
336 ) AS items_list,
337
338 (
339 SELECT string_agg(DISTINCT seller_prof.first_name || ' ' || seller_prof.last_name, ' & ')
340 FROM order_items oi
341 JOIN shipment_items si ON si.order_item_id = oi.order_item_id
342 JOIN product_instances pi ON pi.instance_id = si.instance_id
343 JOIN warehouses wh ON wh.warehouse_id = pi.warehouse_id
344 JOIN user_profiles seller_prof ON seller_prof.user_id = wh.user_id
345 WHERE oi.order_id = o.order_id
346 ) AS sellers,
347
348 s.tracking_number,
349 s.status AS shipping_status,
350 c_prof.first_name || ' ' || c_prof.last_name AS courier_name,
351 s.estimated_arrival
352FROM orders o
353LEFT JOIN shipments s ON o.order_id = s.order_id
354LEFT JOIN user_profiles c_prof ON s.courier_id = c_prof.user_id
355WHERE o.status <> 'CART'
356ORDER BY o.order_date DESC;