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