-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSql.sql
More file actions
154 lines (134 loc) · 3.75 KB
/
Sql.sql
File metadata and controls
154 lines (134 loc) · 3.75 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
CREATE DATABASE amazon_sales;
USE amazon_sales;
-- Customers Table
CREATE TABLE customers (
CustomerID INT PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(150),
Country VARCHAR(100)
);
-- Products Table
CREATE TABLE products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(150),
Category VARCHAR(50),
Price DECIMAL(10,2)
);
-- Orders Table
CREATE TABLE orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
Region VARCHAR(50),
PaymentMethod VARCHAR(50),
FOREIGN KEY (CustomerID) REFERENCES customers(CustomerID)
);
-- Order Details Table
CREATE TABLE order_details (
OrderDetailID INT AUTO_INCREMENT PRIMARY KEY,
OrderID INT,
ProductID INT,
Quantity INT,
Price DECIMAL(10,2),
Revenue DECIMAL(10,2),
ProfitMargin DECIMAL(10,2),
FOREIGN KEY (OrderID) REFERENCES orders(OrderID),
FOREIGN KEY (ProductID) REFERENCES products(ProductID)
);
-- Check total records in each table
SELECT 'customers' AS table_name, COUNT(*) AS `rows` FROM customers
UNION ALL
SELECT 'products', COUNT(*) FROM products
UNION ALL
SELECT 'orders', COUNT(*) FROM orders
UNION ALL
SELECT 'order_details', COUNT(*) FROM order_details;
-- Peek at some data
SELECT * FROM customers LIMIT 5;
SELECT * FROM products LIMIT 5;
SELECT * FROM orders LIMIT 5;
SELECT * FROM order_details LIMIT 5;
-- Overall KPIs
SELECT
ROUND(SUM(Revenue), 2) AS Total_Revenue,
ROUND(SUM(ProfitMargin), 2) AS Total_Profit,
COUNT(DISTINCT OrderID) AS Total_Orders,
ROUND(SUM(Revenue)/COUNT(DISTINCT OrderID), 2) AS Avg_Order_Value
FROM order_details;
-- Yearly and Monthly Revenue
SELECT
EXTRACT(YEAR FROM o.OrderDate) AS Year,
EXTRACT(MONTH FROM o.OrderDate) AS Month,
ROUND(SUM(od.Revenue), 2) AS Monthly_Revenue,
ROUND(SUM(od.ProfitMargin), 2) AS Monthly_Profit
FROM order_details od
JOIN orders o ON od.OrderID = o.OrderID
GROUP BY Year, Month
ORDER BY Year, Month;
-- Top 10 Products by Revenue
SELECT
p.ProductName,
ROUND(SUM(od.Revenue), 2) AS Total_Revenue
FROM order_details od
JOIN products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName
ORDER BY Total_Revenue DESC
LIMIT 10;
-- Category wise revenue profit margin
SELECT
p.Category,
ROUND(SUM(od.Revenue), 2) AS Category_Revenue,
ROUND(SUM(od.ProfitMargin), 2) AS Category_Profit
FROM order_details od
JOIN products p ON od.ProductID = p.ProductID
GROUP BY p.Category
ORDER BY Category_Revenue DESC;
-- Top 10 Customers by Spent
SELECT
c.Name AS Customer,
ROUND(SUM(od.Revenue), 2) AS Total_Spent
FROM order_details od
JOIN orders o ON od.OrderID = o.OrderID
JOIN customers c ON o.CustomerID = c.CustomerID
GROUP BY c.CustomerID, c.Name
ORDER BY Total_Spent DESC
LIMIT 10;
-- Regional Sales
SELECT
o.Region,
ROUND(SUM(od.Revenue), 2) AS Regional_Revenue,
ROUND(SUM(od.ProfitMargin), 2) AS Regional_Profit
FROM orders o
JOIN order_details od ON o.OrderID = od.OrderID
GROUP BY o.Region
ORDER BY Regional_Revenue DESC;
-- Payment method analysis
SELECT
o.PaymentMethod,
ROUND(SUM(od.Revenue), 2) AS Payment_Revenue
FROM orders o
JOIN order_details od ON o.OrderID = od.OrderID
GROUP BY o.PaymentMethod
ORDER BY Payment_Revenue DESC;
-- Ranking Top Products Using Window Function
WITH ProductRevenue AS (
SELECT
p.ProductName,
SUM(od.Revenue) AS Total_Revenue
FROM order_details od
JOIN products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName
)
SELECT
ProductName,
Total_Revenue,
RANK() OVER (ORDER BY Total_Revenue DESC) AS Rank_By_Revenue
FROM ProductRevenue
LIMIT 10;
SELECT
DATE_FORMAT(OrderDate, '%Y-%m') AS Month,
ROUND(SUM(od.Revenue), 2) AS Monthly_Revenue
FROM orders o
JOIN order_details od ON o.OrderID = od.OrderID
GROUP BY Month
ORDER BY Month;