| | 1 | = Залихи под минималното ниво = |
| | 2 | |
| | 3 | == Опис == |
| | 4 | |
| | 5 | Извештајот ги прикажува сите производи чија вкупна залиха е под минималното ниво дефинирано во табелата `product`. Овозможува навремено нарачување. |
| | 6 | |
| | 7 | == SQL решение == |
| | 8 | |
| | 9 | {{{ |
| | 10 | CREATE OR REPLACE FUNCTION get_low_stock_products() |
| | 11 | RETURNS TABLE ( |
| | 12 | product_id INT, |
| | 13 | product_name TEXT, |
| | 14 | category_name TEXT, |
| | 15 | min_stock INT, |
| | 16 | current_stock NUMERIC, |
| | 17 | shortage NUMERIC, |
| | 18 | status TEXT |
| | 19 | ) |
| | 20 | LANGUAGE plpgsql |
| | 21 | AS $$ |
| | 22 | BEGIN |
| | 23 | RETURN QUERY |
| | 24 | SELECT |
| | 25 | p.product_id, |
| | 26 | p.name::TEXT AS product_name, |
| | 27 | c.name::TEXT AS category_name, |
| | 28 | p.min_stock, |
| | 29 | COALESCE(SUM(i.quantity_change), 0) AS current_stock, |
| | 30 | p.min_stock - COALESCE(SUM(i.quantity_change), 0) AS shortage, |
| | 31 | CASE |
| | 32 | WHEN COALESCE(SUM(i.quantity_change), 0) <= 0 THEN 'КРИТИЧНО'::TEXT |
| | 33 | WHEN COALESCE(SUM(i.quantity_change), 0) < p.min_stock THEN 'НИСКО'::TEXT |
| | 34 | ELSE 'ОК'::TEXT |
| | 35 | END AS status |
| | 36 | FROM project.product p |
| | 37 | JOIN project.category c ON c.category_id = p.category_id |
| | 38 | LEFT JOIN project.inventory i ON i.product_id = p.product_id |
| | 39 | WHERE p.active = TRUE |
| | 40 | GROUP BY p.product_id, p.name, c.name, p.min_stock |
| | 41 | HAVING COALESCE(SUM(i.quantity_change), 0) < p.min_stock |
| | 42 | ORDER BY shortage DESC; |
| | 43 | END; |
| | 44 | $$; |
| | 45 | }}} |
| | 46 | |
| | 47 | == Релациона алгебра == |
| | 48 | |
| | 49 | {{{ |
| | 50 | P(product_id, name, category_id, min_stock, active) |
| | 51 | C(category_id, name) |
| | 52 | I(inventory_id, product_id, quantity_change) |
| | 53 | |
| | 54 | J1 ← P ⨝ P.category_id = C.category_id C |
| | 55 | J2 ← J1 ⟕ P.product_id = I.product_id I |
| | 56 | |
| | 57 | F1 ← σ active=TRUE (J2) |
| | 58 | |
| | 59 | G ← γ product_id, name, category_name, min_stock; |
| | 60 | COALESCE(SUM(quantity_change), 0) → current_stock, |
| | 61 | min_stock - COALESCE(SUM(quantity_change), 0) → shortage (F1) |
| | 62 | |
| | 63 | F2 ← σ current_stock < min_stock (G) |
| | 64 | |
| | 65 | R ← π product_id, product_name, category_name, min_stock, current_stock, shortage, status (F2) |
| | 66 | |
| | 67 | R_final ← τ shortage DESC (R) |
| | 68 | }}} |