| 2 | | ---- |
| 3 | | |
| 4 | | == 1. ABC Анализа на производи (ABC Product Analysis) == |
| 5 | | |
| 6 | | Овој извештај ги дели производите во сегменти A (80%), B (15%) и C (5%) според нивниот придонес во вкупниот промет, користејќи ги овие проценти за да се прикаже кои производи се најважни за приходот и да се олесни управувањето со залихите. |
| 7 | | |
| 8 | | {{{#!sql |
| 9 | | WITH ProductRevenue AS ( |
| 10 | | SELECT |
| 11 | | p.name AS product_name, |
| 12 | | SUM(si.quantity * si.unit_price_at_sale) AS total_revenue |
| 13 | | FROM product p |
| 14 | | JOIN sale_item si ON p.product_id = si.product_id |
| 15 | | GROUP BY p.name |
| 16 | | ), |
| 17 | | RevenueCalculations AS ( |
| 18 | | SELECT |
| 19 | | product_name, |
| 20 | | total_revenue, |
| 21 | | SUM(total_revenue) OVER (ORDER BY total_revenue DESC) / SUM(total_revenue) OVER () AS cumulative_share |
| 22 | | FROM ProductRevenue |
| 23 | | ) |
| 24 | | SELECT |
| 25 | | product_name, |
| 26 | | ROUND(total_revenue, 2) AS revenue_mkd, |
| 27 | | CASE |
| 28 | | WHEN cumulative_share <= 0.80 THEN 'A (High Value)' |
| 29 | | WHEN cumulative_share <= 0.95 THEN 'B (Medium Value)' |
| 30 | | ELSE 'C (Low Value)' |
| 31 | | END AS abc_classification |
| 32 | | FROM RevenueCalculations; |
| 33 | | }}} |
| 34 | | |
| 35 | | '''Релациона алгебра:''' |
| 36 | | {{{ |
| 37 | | ProductRevenue ← γ name; SUM(quantity × unit_price_at_sale) → total_revenue (product ⨝ product_id sale_item) |
| 38 | | |
| 39 | | RevenueCalculations ← π product_name, total_revenue, |
| 40 | | (RunningSum(total_revenue) / TotalSum(total_revenue)) → cumulative_share |
| 41 | | (τ total_revenue DESC (ProductRevenue)) |
| 42 | | |
| 43 | | Result ← π product_name, |
| 44 | | ROUND(total_revenue, 2) → revenue_mkd, |
| 45 | | CASE(cumulative_share ≤ 0.80 → 'A', |
| 46 | | cumulative_share ≤ 0.95 → 'B', |
| 47 | | ELSE → 'C') → abc_classification |
| 48 | | (RevenueCalculations) |
| 49 | | }}} |
| 50 | | |
| 51 | | ---- |
| | 2 | --- |
| 126 | | == 4. Перформанси на добавувачите (Supplier Performance Matrix) == |
| 127 | | |
| 128 | | Го мери доцнењето на испораките од добавувачите и ја пресметува нивната доверливост во исполнување на роковите. |
| 129 | | |
| 130 | | {{{#!sql |
| 131 | | SELECT |
| 132 | | s.name AS supplier_name, |
| 133 | | COUNT(po.po_id) AS total_orders, |
| 134 | | AVG(po.actual_delivery_date - po.expected_delivery_date) AS average_delay_days, |
| 135 | | ROUND(COUNT(CASE WHEN po.actual_delivery_date <= po.expected_delivery_date THEN 1 END) * 100.0 / COUNT(*), 2) AS on_time_delivery_rate |
| 136 | | FROM supplier s |
| 137 | | JOIN purchase_order po ON s.supplier_id = po.supplier_id |
| 138 | | WHERE po.status = 'DELIVERED' |
| 139 | | GROUP BY s.name; |
| 140 | | }}} |
| 141 | | |
| 142 | | '''Релациона алгебра:''' |
| 143 | | {{{ |
| 144 | | Temp1 ← supplier ⨝ supplier_id=supplier_id purchase_order |
| 145 | | |
| 146 | | Temp2 ← σ status='DELIVERED' (Temp1) |
| 147 | | |
| 148 | | Result ← γ supplier.name → supplier_name; |
| 149 | | COUNT(po_id) → total_orders, |
| 150 | | AVG(actual_delivery_date - expected_delivery_date) → average_delay_days, |
| 151 | | ROUND(COUNT(actual_delivery_date ≤ expected_delivery_date) × 100.0 / COUNT(*), 2) → on_time_delivery_rate |
| 152 | | (Temp2) |
| 153 | | }}} |
| 154 | | |
| 155 | | ---- |
| 156 | | |
| 157 | | == 5. RFM Анализа на клиенти (Customer RFM Segmentation) == |
| 158 | | |
| 159 | | Ги сегментира купувачите според тоа кога последен пат купувале, колку често се враќаат и колку пари потрошиле. |
| 160 | | |
| 161 | | {{{#!sql |
| 162 | | SELECT |
| 163 | | c.name AS customer_name, |
| 164 | | EXTRACT(DAY FROM CURRENT_TIMESTAMP - MAX(s.date_time)) AS recency_days, |
| 165 | | COUNT(s.sale_id) AS frequency_count, |
| 166 | | SUM(s.total_amount) AS monetary_total, |
| 167 | | NTILE(5) OVER (ORDER BY MAX(s.date_time)) AS r_score, |
| 168 | | NTILE(5) OVER (ORDER BY COUNT(s.sale_id)) AS f_score, |
| 169 | | NTILE(5) OVER (ORDER BY SUM(s.total_amount)) AS m_score |
| 170 | | FROM customer c |
| 171 | | JOIN sale s USING (customer_id) |
| 172 | | GROUP BY c.customer_id, c.name; |
| 173 | | }}} |
| 174 | | |
| 175 | | '''Релациона алгебра:''' |
| 176 | | {{{ |
| 177 | | Temp1 ← customer ⨝ customer_id=customer_id sale |
| 178 | | |
| 179 | | Result ← γ customer_id, name → customer_name; |
| 180 | | EXTRACT(DAY FROM CURRENT_TIMESTAMP - MAX(date_time)) → recency_days, |
| 181 | | COUNT(sale_id) → frequency_count, |
| 182 | | SUM(total_amount) → monetary_total, |
| 183 | | NTILE(5, MAX(date_time)) → r_score, |
| 184 | | NTILE(5, COUNT(sale_id)) → f_score, |
| 185 | | NTILE(5, SUM(total_amount)) → m_score |
| 186 | | (Temp1) |
| 187 | | }}} |
| 188 | | |
| 189 | | ---- |
| 190 | | |
| 191 | | == 6. Искористеност на капацитетот на магацините (Warehouse Utilization Rate) == |
| | 77 | == 6. Искористеност на капацитетот на магацините == |
| 252 | | ---- |
| 253 | | |
| 254 | | == 8. Маржа на профит по категорија (Category Profit Margin) == |
| 255 | | |
| 256 | | Ја пресметува разликата помеѓу продажната и набавната цена за секоја категорија производи. |
| 257 | | |
| 258 | | {{{#!sql |
| 259 | | WITH ProductCosts AS ( |
| 260 | | SELECT product_id, AVG(unit_cost) AS average_cost FROM purchase_order_item GROUP BY 1 |
| 261 | | ) |
| 262 | | SELECT |
| 263 | | c.name AS category_name, |
| 264 | | SUM(si.quantity * si.unit_price_at_sale) AS gross_revenue, |
| 265 | | SUM(si.quantity * pc.average_cost) AS total_cost_of_goods, |
| 266 | | ROUND(((SUM(si.quantity * si.unit_price_at_sale) - SUM(si.quantity * pc.average_cost)) / |
| 267 | | NULLIF(SUM(si.quantity * si.unit_price_at_sale), 0)) * 100, 2) AS profit_margin_pct |
| 268 | | FROM category c |
| 269 | | JOIN product p USING (category_id) |
| 270 | | JOIN sale_item si USING (product_id) |
| 271 | | JOIN ProductCosts pc USING (product_id) |
| 272 | | GROUP BY c.name; |
| 273 | | }}} |
| 274 | | |
| 275 | | '''Релациона алгебра:''' |
| 276 | | {{{ |
| 277 | | ProductCosts ← γ product_id; AVG(unit_cost) → average_cost (purchase_order_item) |
| 278 | | |
| 279 | | Temp1 ← category ⨝ category_id=category_id product |
| 280 | | |
| 281 | | Temp2 ← Temp1 ⨝ product_id=product_id sale_item |
| 282 | | |
| 283 | | Temp3 ← Temp2 ⨝ product_id=product_id ProductCosts |
| 284 | | |
| 285 | | Result ← γ category.name → category_name; |
| 286 | | SUM(quantity × unit_price_at_sale) → gross_revenue, |
| 287 | | SUM(quantity × average_cost) → total_cost_of_goods, |
| 288 | | ROUND(((SUM(quantity × unit_price_at_sale) - SUM(quantity × average_cost)) / |
| 289 | | NULLIF(SUM(quantity × unit_price_at_sale), 0)) × 100, 2) → profit_margin_pct |
| 290 | | (Temp3) |
| 291 | | }}} |
| 332 | | |
| 333 | | == 10. Финансиска вредност на залихите (Stock Asset Valuation) == |
| 334 | | |
| 335 | | Дава точен преглед на вкупната парична вредност на производите во магацините врз основа на последните набавни цени. |
| 336 | | |
| 337 | | {{{#!sql |
| 338 | | SELECT |
| 339 | | w.name AS warehouse_location, |
| 340 | | SUM(ws.quantity_on_hand * ( |
| 341 | | SELECT unit_cost FROM purchase_order_item poi |
| 342 | | WHERE poi.product_id = ws.product_id |
| 343 | | ORDER BY po_id DESC LIMIT 1 |
| 344 | | )) AS total_inventory_valuation_mkd |
| 345 | | FROM warehouse w |
| 346 | | JOIN warehouse_stock ws USING (warehouse_id) |
| 347 | | GROUP BY w.name; |
| 348 | | }}} |