| 12 | | SQL CODE |
| | 12 | WITH product_sales_yearly AS ( |
| | 13 | SELECT |
| | 14 | op.product_id, |
| | 15 | SUM(op.quantity) AS total_sold_yearly, |
| | 16 | |
| | 17 | SUM(op.quantity) / 365.0 AS daily_sales_velocity |
| | 18 | FROM project.ORDER_PRODUCTS op |
| | 19 | JOIN project.ORDERS o ON op.order_id = o.order_id |
| | 20 | |
| | 21 | WHERE o.purchase_date >= CURRENT_DATE - INTERVAL '1 year' |
| | 22 | AND o.status IN ('PAID', 'SHIPPED', 'DELIVERED') |
| | 23 | GROUP BY op.product_id |
| | 24 | ), |
| | 25 | inventory_velocity AS ( |
| | 26 | SELECT |
| | 27 | p.product_id, |
| | 28 | p.format, |
| | 29 | p.stock, |
| | 30 | p.price, |
| | 31 | r.title AS release_title, |
| | 32 | psy.total_sold_yearly, |
| | 33 | psy.daily_sales_velocity, |
| | 34 | |
| | 35 | CASE |
| | 36 | WHEN psy.daily_sales_velocity > 0 THEN p.stock / psy.daily_sales_velocity |
| | 37 | ELSE 9999 |
| | 38 | END AS days_until_out_of_stock |
| | 39 | FROM project.PRODUCTS p |
| | 40 | JOIN project.RELEASES r ON p.release_id = r.release_id |
| | 41 | JOIN product_sales_yearly psy ON p.product_id = psy.product_id |
| | 42 | ) |
| | 43 | SELECT |
| | 44 | product_id, |
| | 45 | release_title, |
| | 46 | format, |
| | 47 | stock AS current_stock, |
| | 48 | total_sold_yearly, |
| | 49 | ROUND(daily_sales_velocity, 4) AS daily_velocity, |
| | 50 | ROUND(days_until_out_of_stock, 1) AS days_left, |
| | 51 | |
| | 52 | CEIL((daily_sales_velocity * 90) - stock) AS recommended_restock_quantity, |
| | 53 | |
| | 54 | ROUND(CEIL((daily_sales_velocity * 90) - stock) * price, 2) AS estimated_restock_cost |
| | 55 | FROM inventory_velocity |
| | 56 | WHERE days_until_out_of_stock < 30 |
| | 57 | ORDER BY daily_velocity DESC, days_left ASC; |