| | 1 | = Најпрофитабилни категории по месеци = |
| | 2 | |
| | 3 | == Опис == |
| | 4 | |
| | 5 | Извештајот ги прикажува сите категории на производи, групирани по месец, со вкупниот приход и бројот на продадени артикли. Овозможува анализа на сезонските трендови по категорија. |
| | 6 | |
| | 7 | == SQL решение == |
| | 8 | |
| | 9 | {{{ |
| | 10 | CREATE OR REPLACE FUNCTION get_category_revenue_by_month() |
| | 11 | RETURNS TABLE ( |
| | 12 | category_id INT, |
| | 13 | category_name TEXT, |
| | 14 | month TEXT, |
| | 15 | total_items_sold BIGINT, |
| | 16 | total_revenue NUMERIC, |
| | 17 | order_count BIGINT |
| | 18 | ) |
| | 19 | LANGUAGE plpgsql |
| | 20 | AS $$ |
| | 21 | BEGIN |
| | 22 | RETURN QUERY |
| | 23 | SELECT |
| | 24 | c.category_id, |
| | 25 | c.name::TEXT AS category_name, |
| | 26 | TO_CHAR(o.created_at, 'YYYY-MM')::TEXT AS month, |
| | 27 | SUM(oi.quantity) AS total_items_sold, |
| | 28 | SUM(oi.quantity * oi.unit_price) AS total_revenue, |
| | 29 | COUNT(DISTINCT o.order_id) AS order_count |
| | 30 | FROM project.order_item oi |
| | 31 | JOIN project.orders o ON o.order_id = oi.order_id |
| | 32 | JOIN project.product p ON p.product_id = oi.product_id |
| | 33 | JOIN project.category c ON c.category_id = p.category_id |
| | 34 | WHERE o.status = 'ПЛАТЕНА' |
| | 35 | AND o.created_at >= NOW() - INTERVAL '12 months' |
| | 36 | GROUP BY c.category_id, c.name, TO_CHAR(o.created_at, 'YYYY-MM') |
| | 37 | ORDER BY month DESC, total_revenue DESC; |
| | 38 | END; |
| | 39 | $$; |
| | 40 | }}} |
| | 41 | |
| | 42 | == Релациона алгебра == |
| | 43 | |
| | 44 | {{{ |
| | 45 | P(product_id, category_id) |
| | 46 | C(category_id, name) |
| | 47 | O(order_id, status, created_at) |
| | 48 | OI(order_id, product_id, quantity, unit_price) |
| | 49 | |
| | 50 | J1 ← OI ⨝ OI.order_id = O.order_id O |
| | 51 | J2 ← J1 ⨝ OI.product_id = P.product_id P |
| | 52 | J3 ← J2 ⨝ P.category_id = C.category_id C |
| | 53 | |
| | 54 | F1 ← σ status='ПЛАТЕНА' ∧ created_at ≥ NOW() - INTERVAL '12 months' (J3) |
| | 55 | |
| | 56 | G ← γ category_id, category_name, month; |
| | 57 | SUM(quantity) → total_items_sold, |
| | 58 | SUM(quantity * unit_price) → total_revenue, |
| | 59 | COUNT(DISTINCT order_id) → order_count (F1) |
| | 60 | |
| | 61 | R ← π category_id, category_name, month, total_items_sold, total_revenue, order_count (G) |
| | 62 | |
| | 63 | R_final ← τ month DESC, total_revenue DESC (R) |
| | 64 | }}} |