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