-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patholist_sql_file.sql
More file actions
140 lines (115 loc) · 3.12 KB
/
Copy patholist_sql_file.sql
File metadata and controls
140 lines (115 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
CREATE DATABASE olist;
USE olist;
CREATE TABLE orders_master (
order_id VARCHAR(50),
order_item_id INT,
product_id VARCHAR(50),
seller_id VARCHAR(50),
price DECIMAL(10,2),
freight_value DECIMAL(10,2),
product_category_name_english VARCHAR(100),
seller_state VARCHAR(10),
customer_id VARCHAR(50),
order_status VARCHAR(20),
order_purchase_timestamp DATETIME,
customer_state VARCHAR(10),
payment_value DECIMAL(10,2),
payment_type VARCHAR(20),
review_score FLOAT
);
SELECT * FROM orders_master;
SELECT COUNT(*) FROM orders_master;
-- Monthly Revenue
SELECT
DATE_FORMAT(order_purchase_timestamp, '%Y-%m') AS month,
ROUND(SUM(payment_value), 2) AS revenue
FROM orders_master
GROUP BY DATE_FORMAT(order_purchase_timestamp, '%Y-%m')
ORDER BY DATE_FORMAT(order_purchase_timestamp, '%Y-%m');
-- Top 10 Categories by Revenue
SELECT
product_category_name_english AS category,
ROUND(SUM(payment_value), 2) AS revenue
FROM orders_master
WHERE product_category_name_english IS NOT NULL
GROUP BY category
ORDER BY revenue DESC
LIMIT 10;
-- Top State with high orders
SELECT
customer_state,
COUNT(order_id) AS order_count
FROM orders_master
GROUP BY customer_state
ORDER BY order_count DESC
LIMIT 10;
-- Review Score
SELECT
review_score,
COUNT(*) AS count
FROM orders_master
WHERE review_score IS NOT NULL
GROUP BY review_score
ORDER BY review_score;
-- Payment Type
SELECT
payment_type,
COUNT(*) AS count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) AS percentage
FROM orders_master
WHERE payment_type IS NOT NULL
GROUP BY payment_type
ORDER BY count DESC;
-- RFM Segment
SELECT
segment,
COUNT(*) AS customer_count,
ROUND(AVG(monetary), 2) AS avg_monetary,
ROUND(AVG(recency), 2) AS avg_recency
FROM rfm_segments
GROUP BY segment
ORDER BY customer_count DESC;
-- Average order value
SELECT
customer_state,
COUNT(*) AS orders,
ROUND(AVG(payment_value), 2) AS avg_order_value
FROM orders_master
WHERE customer_state IN ('SP', 'RJ')
GROUP BY customer_state;
-- Segment Final
SELECT
segment,
COUNT(*) AS customers,
ROUND(AVG(monetary), 2) AS avg_monetary,
ROUND(AVG(monetary / frequency), 2) AS avg_order_value,
ROUND(AVG(frequency), 2) AS avg_frequency
FROM rfm_segments
GROUP BY segment
ORDER BY avg_monetary DESC;
-- Reviews
SELECT * FROM delivery_data;
SELECT
CASE WHEN d.delivery_delay > 0 THEN 'Late' ELSE 'On-Time' END AS delivery_status,
COUNT(*) AS orders,
ROUND(AVG(o.review_score), 2) AS avg_review_score
FROM orders_master o
JOIN delivery_data d ON o.order_id = d.order_id
WHERE o.review_score IS NOT NULL
AND d.delivery_delay IS NOT NULL
GROUP BY delivery_status;
-- Avg delay vs Avg review
SELECT
o.seller_id,
COUNT(DISTINCT o.order_id) AS total_orders,
ROUND(AVG(o.review_score), 2) AS avg_review,
ROUND(SUM(o.payment_value), 2) AS total_revenue,
ROUND(AVG(d.delivery_delay), 2) AS avg_delay
FROM orders_master o
JOIN delivery_data d
ON o.order_id = d.order_id
WHERE o.review_score IS NOT NULL
GROUP BY o.seller_id
HAVING total_orders >= 10
ORDER BY total_revenue DESC
LIMIT 10;