| | 1 | = Најпрофитабилни маси = |
| | 2 | |
| | 3 | == Опис == |
| | 4 | |
| | 5 | Извештајот ги прикажува масите со најголем вкупен приход, број на нарачки, просечна вредност на нарачка и приход по седиште. |
| | 6 | |
| | 7 | == SQL решение == |
| | 8 | |
| | 9 | {{{ |
| | 10 | CREATE OR REPLACE FUNCTION get_top_tables() |
| | 11 | RETURNS TABLE ( |
| | 12 | table_id INT, |
| | 13 | table_number TEXT, |
| | 14 | capacity INT, |
| | 15 | order_count BIGINT, |
| | 16 | total_revenue NUMERIC, |
| | 17 | avg_order_value NUMERIC, |
| | 18 | revenue_per_seat NUMERIC |
| | 19 | ) |
| | 20 | LANGUAGE plpgsql |
| | 21 | AS $$ |
| | 22 | BEGIN |
| | 23 | RETURN QUERY |
| | 24 | SELECT |
| | 25 | rt.table_id, |
| | 26 | rt.table_number::TEXT, |
| | 27 | rt.capacity, |
| | 28 | COUNT(DISTINCT o.order_id) AS order_count, |
| | 29 | SUM(p.amount) AS total_revenue, |
| | 30 | ROUND(AVG(p.amount), 2) AS avg_order_value, |
| | 31 | ROUND(SUM(p.amount) / rt.capacity, 2) AS revenue_per_seat |
| | 32 | FROM project.restaurant_table rt |
| | 33 | JOIN project.orders o ON o.table_id = rt.table_id |
| | 34 | JOIN project.payment p ON p.order_id = o.order_id |
| | 35 | WHERE o.status = 'ПЛАТЕНА' |
| | 36 | GROUP BY rt.table_id, rt.table_number, rt.capacity |
| | 37 | ORDER BY total_revenue DESC; |
| | 38 | END; |
| | 39 | $$; |
| | 40 | }}} |
| | 41 | |
| | 42 | == Релациона алгебра == |
| | 43 | |
| | 44 | {{{ |
| | 45 | RT(table_id, table_number, capacity) |
| | 46 | O(order_id, table_id, status) |
| | 47 | P(payment_id, order_id, amount) |
| | 48 | |
| | 49 | J1 ← RT ⨝ RT.table_id = O.table_id O |
| | 50 | J2 ← J1 ⨝ O.order_id = P.order_id P |
| | 51 | |
| | 52 | F1 ← σ status='ПЛАТЕНА' (J2) |
| | 53 | |
| | 54 | G ← γ table_id, table_number, capacity; |
| | 55 | COUNT(DISTINCT order_id) → order_count, |
| | 56 | SUM(amount) → total_revenue, |
| | 57 | AVG(amount) → avg_order_value, |
| | 58 | SUM(amount)/capacity → revenue_per_seat (F1) |
| | 59 | |
| | 60 | R ← π table_id, table_number, capacity, order_count, total_revenue, avg_order_value, revenue_per_seat (G) |
| | 61 | |
| | 62 | R_final ← τ total_revenue DESC (R) |
| | 63 | }}} |