Repository navigation
Expand file tree
/
Copy pathAmazon_Queries.sql
More file actions
316 lines (266 loc) · 8.9 KB
/
Copy pathAmazon_Queries.sql
File metadata and controls
316 lines (266 loc) · 8.9 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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
-- ================================================
-- AMAZON ORDERS DATASET - SQL ANALYSIS
-- Student: Swaroop Kumar Vathada
-- Tool: MySQL Workbench
-- Database: amazon_project
-- ================================================
-- Creating a database with name amazon_project
CREATE DATABASE amazon_project;
-- Using amazon_project database
USE amazon_project;
-- Creating a table with name amazon_orders with respective dataset Columns
CREATE TABLE amazon_orders (
Order_ID VARCHAR(50),
Date DATE,
Status VARCHAR(100),
Fulfilment VARCHAR(50),
Sales_Channel VARCHAR(50),
Ship_Service_Level VARCHAR(50),
Style VARCHAR(50),
SKU VARCHAR(100),
Category VARCHAR(50),
Size VARCHAR(20),
ASIN VARCHAR(50),
Courier_Status VARCHAR(50),
Qty INT,
Currency VARCHAR(10),
Amount DECIMAL(10,2),
Ship_City VARCHAR(100),
Ship_State VARCHAR(100),
Ship_Postal_Code VARCHAR(20),
Ship_Country VARCHAR(50),
Promotion_IDs TEXT,
B2B VARCHAR(5),
Promotion_Type VARCHAR(50),
Revenue_Band VARCHAR(20),
Order_Month INT,
Order_Month_Name VARCHAR(20),
Order_Year INT,
Order_Week INT,
Order_Day VARCHAR(20),
Amount_Outlier_Flag VARCHAR(10)
);
-- Loading the Cleaned_Amazon_dataset
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Cleaned_Amazon_Dataset.csv'
INTO TABLE amazon_orders
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
-- Finding where MySQL allows file imports:
SHOW VARIABLES LIKE 'secure_file_priv';
-- ================================================
-- SECTION 1: BASIC EXPLORATION
-- ================================================
-- Query 1: Total Number of Orders
-- Purpose: Confirm how many records are loaded correctly
SELECT COUNT(*) AS Total_Orders
FROM amazon_orders;
-- ------------------------------------------------
-- Query 2: Preview First 10 Rows
-- Purpose: Visually verify data looks clean after import
SELECT *
FROM amazon_orders
LIMIT 10;
-- ------------------------------------------------
-- Query 3: Unique Values in Key Columns
-- Purpose: Understand variety of data in important columns
SELECT
COUNT(DISTINCT Category) AS Unique_Categories,
COUNT(DISTINCT Size) AS Unique_Sizes,
COUNT(DISTINCT Status) AS Unique_Statuses,
COUNT(DISTINCT Ship_State) AS Unique_States,
COUNT(DISTINCT Ship_City) AS Unique_Cities
FROM amazon_orders;
-- ================================================
-- SECTION 2: ORDERS BASED ANALYSIS
-- ================================================
-- Query 4: Orders by Product Category
-- Purpose: Find which category receives most orders
SELECT
Category,
COUNT(*) AS Total_Orders
FROM amazon_orders
GROUP BY Category
ORDER BY Total_Orders DESC;
-- ------------------------------------------------
-- Query 5: Top 5 States by Total Revenue
-- Purpose: Identify which states generate maximum sales amount
SELECT
Ship_State,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue
FROM amazon_orders
GROUP BY Ship_State
ORDER BY Total_Revenue DESC
LIMIT 5;
-- ------------------------------------------------
-- Query 6: Top 5 Cities by Total Revenue
-- Purpose: Identify which cities generate maximum sales amount
SELECT
Ship_City,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue
FROM amazon_orders
GROUP BY Ship_City
ORDER BY Total_Revenue DESC
LIMIT 5;
-- ------------------------------------------------
-- Query 7: Orders by Ship State
-- Purpose: Count total orders from each state
SELECT
Ship_State,
COUNT(*) AS Total_Orders
FROM amazon_orders
GROUP BY Ship_State
ORDER BY Total_Orders DESC;
-- ------------------------------------------------
-- Query 8: Orders by Ship City
-- Purpose: Count total orders from each city
SELECT
Ship_City,
COUNT(*) AS Total_Orders
FROM amazon_orders
GROUP BY Ship_City
ORDER BY Total_Orders DESC;
-- ------------------------------------------------
-- Query 9: Orders by Courier Status
-- Purpose: See how many orders were delivered, returned etc
SELECT
Courier_Status,
COUNT(*) AS Total_Orders,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM amazon_orders), 2) AS Percentage
FROM amazon_orders
GROUP BY Courier_Status
ORDER BY Total_Orders DESC;
-- ================================================
-- SECTION 3: REVENUE BASED ANALYSIS
-- ================================================
-- Query 10: Monthly Revenue Trend
-- Purpose: Understand how revenue changes month by month
SELECT
Order_Year,
Order_Month,
Order_Month_Name,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY Order_Year, Order_Month, Order_Month_Name
ORDER BY Order_Year, Order_Month;
-- ------------------------------------------------
-- Query 11: Revenue by Fulfilment Channel
-- Purpose: Compare Amazon fulfilled vs Merchant fulfilled revenue
SELECT
Fulfilment,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY Fulfilment
ORDER BY Total_Revenue DESC;
-- ------------------------------------------------
-- Query 12: Revenue by Ship Service Level
-- Purpose: Check if expedited shipping brings higher value orders
SELECT
Ship_Service_Level,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY Ship_Service_Level
ORDER BY Total_Revenue DESC;
-- ------------------------------------------------
-- Query 13: Quantity vs Amount by Category
-- Purpose: Understand relation between qty sold and revenue per category
SELECT
Category,
SUM(Qty) AS Total_Qty_Sold,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY Category
ORDER BY Total_Revenue DESC;
-- ================================================
-- SECTION 4: GENERAL ANALYSIS
-- ================================================
-- Query 14: Cancellation Rate by Category
-- Purpose: Find which categories have highest cancellation
SELECT
Category,
COUNT(*) AS Total_Orders,
SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) AS Cancelled_Orders,
ROUND(SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS Cancellation_Rate_Percent
FROM amazon_orders
GROUP BY Category
ORDER BY Cancellation_Rate_Percent DESC;
-- ------------------------------------------------
-- Query 15: Cancellation Rate by Size
-- Purpose: Find which sizes have highest cancellation rate
SELECT
Size,
COUNT(*) AS Total_Orders,
SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) AS Cancelled_Orders,
ROUND(SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS Cancellation_Rate_Percent
FROM amazon_orders
GROUP BY Size
ORDER BY Cancellation_Rate_Percent DESC;
-- ------------------------------------------------
-- Query 16: Promotion vs No Promotion Revenue
-- Purpose: Check if promotions actually drive more revenue
SELECT
Promotion_Type,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY Promotion_Type
ORDER BY Total_Revenue DESC;
-- ------------------------------------------------
-- Query 17: Ship Service vs Product Category
-- Purpose: Find which categories prefer which shipping type
SELECT
Ship_Service_Level,
Category,
COUNT(*) AS Total_Orders
FROM amazon_orders
GROUP BY Ship_Service_Level, Category
ORDER BY Ship_Service_Level, Total_Orders DESC;
-- ------------------------------------------------
-- Query 18: Top 10 SKUs by Revenue
-- Purpose: Identify best performing individual products
SELECT
SKU,
Category,
COUNT(*) AS Total_Orders,
SUM(Qty) AS Total_Qty_Sold,
ROUND(SUM(Amount), 2) AS Total_Revenue
FROM amazon_orders
GROUP BY SKU, Category
ORDER BY Total_Revenue DESC
LIMIT 10;
-- ------------------------------------------------
-- Query 19: B2B vs B2C Orders
-- Purpose: Compare business orders vs individual customer orders
SELECT
B2B,
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value
FROM amazon_orders
GROUP BY B2B
ORDER BY Total_Revenue DESC;
-- ------------------------------------------------
-- Query 20: Overall KPI Summary
-- Purpose: Single view of all important business metrics
SELECT
COUNT(*) AS Total_Orders,
ROUND(SUM(Amount), 2) AS Total_Revenue,
ROUND(AVG(Amount), 2) AS Avg_Order_Value,
SUM(Qty) AS Total_Qty_Sold,
SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) AS Total_Cancelled,
ROUND(SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS Overall_Cancellation_Rate
FROM amazon_orders;
-- ================================================
-- END OF SQL ANALYSIS
-- ================================================