dataco-supply-chain-delay-prediction / SQL /analysis_queries.sql
yash441alt's picture
Upload folder using huggingface_hub
380637e verified
Raw
History Blame Contribute Delete
4.2 kB
-- Supply Chain Delay Analysis Queries
USE supply_chain_db;
-- =========================================================================
-- SECTION A: Simple SQL Queries (Basic Data Inspection)
-- =========================================================================
-- 1. View first 5 customers in the database
SELECT customer_id, customer_fname, customer_lname, customer_city FROM customers LIMIT 5;
-- 2. Count total number of orders in the system
SELECT COUNT(*) AS total_orders_count FROM orders;
-- 3. Filter orders to find 10 delayed shipments
SELECT order_id, order_date, shipping_mode, late_delivery_risk
FROM orders
WHERE late_delivery_risk = 1
LIMIT 10;
-- 4. Count customers grouped by segment (Consumer, Corporate, etc.)
SELECT customer_segment, COUNT(*) AS customer_count
FROM customers
GROUP BY customer_segment;
-- 5. List the top 5 most expensive products
SELECT product_name, product_price
FROM products
ORDER BY product_price DESC
LIMIT 5;
-- =========================================================================
-- SECTION B: Advanced Supply Chain Delay Analysis Queries
-- =========================================================================
-- 1. Late Delivery Rate per Shipping Mode
-- This query helps understand if certain shipping modes (e.g. Same Day, First Class) have a higher risk of delay.
SELECT
shipping_mode,
COUNT(*) AS total_orders,
SUM(CASE WHEN late_delivery_risk = 1 THEN 1 ELSE 0 END) AS delayed_orders,
ROUND(SUM(CASE WHEN late_delivery_risk = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS late_delivery_rate_percent,
ROUND(AVG(days_for_shipping_real), 2) AS avg_actual_shipping_days,
ROUND(AVG(days_for_shipping_scheduled), 2) AS avg_scheduled_shipping_days
FROM orders
GROUP BY shipping_mode
ORDER BY late_delivery_rate_percent DESC;
-- 2. Delayed Orders by Customer Segment and Market Region
-- This identifies which regions and customer types experience the most shipping bottlenecks.
SELECT
c.customer_segment,
o.market,
o.order_region,
COUNT(*) AS total_orders,
SUM(CASE WHEN o.late_delivery_risk = 1 THEN 1 ELSE 0 END) AS delayed_orders,
ROUND(SUM(CASE WHEN o.late_delivery_risk = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS late_delivery_rate_percent
FROM orders o
JOIN customers c ON o.order_customer_id = c.customer_id
GROUP BY c.customer_segment, o.market, o.order_region
HAVING total_orders > 100
ORDER BY late_delivery_rate_percent DESC
LIMIT 15;
-- 3. Product Categories with the Highest Delays
-- This highlights if specific product categories suffer from supply chain bottlenecks.
SELECT
cat.category_name,
COUNT(DISTINCT o.order_id) AS total_orders,
SUM(CASE WHEN o.late_delivery_risk = 1 THEN 1 ELSE 0 END) AS delayed_orders,
ROUND(SUM(CASE WHEN o.late_delivery_risk = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(DISTINCT o.order_id), 2) AS late_delivery_rate_percent
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.order_item_cardprod_id = p.product_card_id
JOIN categories cat ON p.product_category_id = cat.category_id
GROUP BY cat.category_name
HAVING total_orders > 50
ORDER BY late_delivery_rate_percent DESC
LIMIT 15;
-- 4. Financial Impact: Profit Loss by Delivery Status
-- This query computes total sales and profits across different delivery statuses (e.g., Late delivery, Shipping canceled).
SELECT
o.delivery_status,
COUNT(DISTINCT o.order_id) AS total_orders,
ROUND(SUM(oi.sales), 2) AS total_sales,
ROUND(SUM(oi.benefit_per_order), 2) AS total_profit,
ROUND(AVG(oi.order_item_discount_rate) * 100, 2) AS avg_discount_rate_percent
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY o.delivery_status
ORDER BY total_profit DESC;
-- 5. Top 10 Countries showing the highest Delay Risk
SELECT
order_country,
COUNT(*) AS total_orders,
SUM(CASE WHEN late_delivery_risk = 1 THEN 1 ELSE 0 END) AS delayed_orders,
ROUND(SUM(CASE WHEN late_delivery_risk = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS late_delivery_rate_percent
FROM orders
GROUP BY order_country
HAVING total_orders > 50
ORDER BY late_delivery_rate_percent DESC
LIMIT 10;