| | 179 | |
| | 180 | == 7. Анализа на тренд на продажба и доволност на залиха == |
| | 181 | |
| | 182 | Цел: Да се анализира продажбата во последните 60 дена и врз основа на просечната дневна продажба да се пресмета дали моменталната залиха е доволна за наредните 30 дена. |
| | 183 | |
| | 184 | {{{#!sql |
| | 185 | WITH recent_sales AS ( |
| | 186 | SELECT |
| | 187 | si.product_id, |
| | 188 | SUM(si.quantity) AS sold_last_60_days |
| | 189 | FROM sale_item si |
| | 190 | JOIN sale s ON si.sale_id = s.sale_id |
| | 191 | WHERE s.date_time >= CURRENT_DATE - INTERVAL '60 days' |
| | 192 | GROUP BY si.product_id |
| | 193 | ), |
| | 194 | current_stock AS ( |
| | 195 | SELECT |
| | 196 | product_id, |
| | 197 | SUM(quantity_on_hand) AS total_stock |
| | 198 | FROM warehouse_stock |
| | 199 | GROUP BY product_id |
| | 200 | ) |
| | 201 | SELECT |
| | 202 | p.product_id, |
| | 203 | p.name AS product_name, |
| | 204 | COALESCE(rs.sold_last_60_days, 0) AS sold_last_60_days, |
| | 205 | ROUND(COALESCE(rs.sold_last_60_days,0)::numeric / 60, 2) AS avg_daily_sales, |
| | 206 | ROUND((COALESCE(rs.sold_last_60_days,0)::numeric / 60) * 30, 2) AS projected_next_30_days, |
| | 207 | COALESCE(cs.total_stock,0) AS current_total_stock, |
| | 208 | CASE |
| | 209 | WHEN COALESCE(cs.total_stock,0) >= |
| | 210 | ((COALESCE(rs.sold_last_60_days,0)::numeric / 60) * 30) |
| | 211 | THEN 'SUFFICIENT' |
| | 212 | ELSE 'INSUFFICIENT' |
| | 213 | END AS stock_status |
| | 214 | FROM product p |
| | 215 | LEFT JOIN recent_sales rs ON p.product_id = rs.product_id |
| | 216 | LEFT JOIN current_stock cs ON p.product_id = cs.product_id |
| | 217 | ORDER BY stock_status, projected_next_30_days DESC; |
| | 218 | |
| | 219 | }}} |
| | 220 | |
| | 221 | '''Релациона алгебра:''' |
| | 222 | {{{ |
| | 223 | τ stock_status, projected_next_30_days ( |
| | 224 | π product_id, product_name, sold_last_60_days, avg_daily_sales, projected_next_30_days, current_total_stock, |
| | 225 | (current_total_stock >= projected_next_30_days ? 'SUFFICIENT' : 'INSUFFICIENT') -> stock_status ( |
| | 226 | π product_id, product_name, sold_last_60_days, sold_last_60_days / 60 -> avg_daily_sales, |
| | 227 | (sold_last_60_days / 60) * 30 -> projected_next_30_days, current_total_stock ( |
| | 228 | product ⟕ ( |
| | 229 | γ product_id ; SUM(quantity)->sold_last_60_days ( |
| | 230 | σ date_time >= CURRENT_DATE - 60 (sale_item ⋈ sale) |
| | 231 | ) |
| | 232 | ) ⟕ ( |
| | 233 | γ product_id ; SUM(quantity_on_hand)->current_total_stock (warehouse_stock) |
| | 234 | ) |
| | 235 | ) |
| | 236 | ) |
| | 237 | ) |
| | 238 | }}} |
| | 239 | |
| | 240 | == 8. Годишен извештај за продажба (последни 12 месеци) == |
| | 241 | |
| | 242 | Цел: Прикажува детална анализа на продажбата за последните 12 месеци, групирана по месец, складиште, категорија и добавувач. |
| | 243 | |
| | 244 | {{{#!sql |
| | 245 | SELECT |
| | 246 | TO_CHAR(date_trunc('month', s.date_time), 'YYYY-MM') AS sales_month, |
| | 247 | w.name AS warehouse_name, |
| | 248 | c.name AS category_name, |
| | 249 | sup.name AS supplier_name, |
| | 250 | COUNT(DISTINCT s.sale_id) AS total_order_count, |
| | 251 | SUM(si.quantity) AS total_units_sold, |
| | 252 | SUM(si.quantity * si.unit_price_at_sale) AS total_gross_revenue |
| | 253 | FROM sale s |
| | 254 | JOIN sale_item si ON s.sale_id = si.sale_id |
| | 255 | JOIN product p ON si.product_id = p.product_id |
| | 256 | LEFT JOIN category c ON p.category_id = c.category_id |
| | 257 | LEFT JOIN supplier sup ON p.supplier_id = sup.supplier_id |
| | 258 | JOIN warehouse w ON s.warehouse_id = w.warehouse_id |
| | 259 | WHERE s.date_time >= date_trunc('month', CURRENT_DATE) - INTERVAL '11 months' |
| | 260 | GROUP BY sales_month, w.name, c.name, sup.name |
| | 261 | ORDER BY sales_month DESC, total_gross_revenue DESC; |
| | 262 | }}} |
| | 263 | |
| | 264 | '''Релациона алгебра:''' |
| | 265 | {{{ |
| | 266 | γ warehouse_name, category_name, supplier_name ; COUNT(sale_id)->total_order_count, SUM(quantity)->total_units_sold, SUM(revenue)->total_gross_revenue ( |
| | 267 | π sale_id, warehouse_name, category_name, supplier_name, quantity, quantity * unit_price_at_sale -> revenue ( |
| | 268 | ( |
| | 269 | ( |
| | 270 | sale |
| | 271 | ⋈ sale_item |
| | 272 | ⋈ ρ name->product_name, description->product_desc (product) |
| | 273 | ) |
| | 274 | ⟕ ρ name->category_name, description->category_desc (category) |
| | 275 | ) |
| | 276 | ⟕ ρ name->supplier_name (supplier) |
| | 277 | ⋈ ρ name->warehouse_name (warehouse) |
| | 278 | ) |
| | 279 | ) |
| | 280 | }}} |
| | 281 | |
| | 282 | == 9. Детален извештај за набавни нарачки == |
| | 283 | |
| | 284 | Цел: Да се прикаже детална состојба на сите набавни нарачки: статус на нарачката, добавувач, магацин, нарачана количина, примена количина и преостаната количина. |
| | 285 | |
| | 286 | {{{#!sql |
| | 287 | SELECT |
| | 288 | po.po_id, |
| | 289 | po.status AS order_status, |
| | 290 | po.order_date, |
| | 291 | po.expected_delivery_date, |
| | 292 | po.actual_delivery_date, |
| | 293 | w.name AS warehouse_name, |
| | 294 | sup.name AS supplier_name, |
| | 295 | p.name AS product_name, |
| | 296 | poi.quantity AS ordered_qty, |
| | 297 | poi.received_quantity AS received_qty, |
| | 298 | (poi.quantity - poi.received_quantity) AS remaining_to_receive |
| | 299 | FROM purchase_order po |
| | 300 | JOIN purchase_order_item poi ON po.po_id = poi.po_id |
| | 301 | JOIN product p ON poi.product_id = p.product_id |
| | 302 | LEFT JOIN supplier sup ON po.supplier_id = sup.supplier_id |
| | 303 | JOIN warehouse w ON po.warehouse_id = w.warehouse_id |
| | 304 | ORDER BY po.status, po.expected_delivery_date; |
| | 305 | }}} |
| | 306 | |
| | 307 | '''Релациона алгебра:''' |
| | 308 | {{{ |
| | 309 | τ status ( |
| | 310 | π po_id, status, order_date, expected_delivery_date, warehouse_name, supplier_name, product_name, quantity->ordered_qty, received_quantity->received_qty, quantity - received_quantity -> remaining_to_receive ( |
| | 311 | ( |
| | 312 | ( |
| | 313 | purchase_order |
| | 314 | ⋈ purchase_order_item |
| | 315 | ⋈ ρ name->product_name, description->product_desc, supplier_id->product_supplier_id (product) |
| | 316 | ) |
| | 317 | ⟕ ρ name->supplier_name (supplier) |
| | 318 | ) |
| | 319 | ⋈ ρ name->warehouse_name (warehouse) |
| | 320 | ) |
| | 321 | ) |
| | 322 | }}} |
| | 323 | |