-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path07_advanced_sql.sql
More file actions
397 lines (312 loc) · 6.63 KB
/
Copy path07_advanced_sql.sql
File metadata and controls
397 lines (312 loc) · 6.63 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
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
USE business_performance;
WITH store_sales AS (
SELECT
s.store_id,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY s.store_id
)
SELECT
st.store_name,
ss.revenue
FROM store_sales ss
JOIN stores st
ON ss.store_id = st.store_id
ORDER BY ss.revenue DESC;
WITH store_sales AS (
SELECT
s.store_id,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY s.store_id
)
SELECT
st.store_name,
ss.revenue,
RANK() OVER (
ORDER BY ss.revenue DESC
) AS revenue_rank
FROM store_sales ss
JOIN stores st
ON ss.store_id = st.store_id
ORDER BY revenue_rank;
WITH product_sales AS (
SELECT
p.product_id,
p.product_name,
p.department,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY
p.product_id,
p.product_name,
p.department
),
ranked_products AS (
SELECT
product_id,
product_name,
department,
revenue,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY revenue DESC
) AS department_rank
FROM product_sales
)
SELECT
product_id,
product_name,
department,
revenue,
department_rank
FROM ranked_products
WHERE department_rank <= 3
ORDER BY
department,
department_rank;
WITH sale_values AS (
SELECT
s.sale_id,
s.sale_date,
s.store_id,
s.employee_id,
s.customer_id,
s.product_id,
ROUND(
p.selling_price
* s.quantity
* (1 - s.discount / 100),
2
) AS sale_value
FROM sales s
JOIN products p
ON s.product_id = p.product_id
),
ranked_sales AS (
SELECT
sale_id,
sale_date,
store_id,
employee_id,
customer_id,
product_id,
sale_value,
ROW_NUMBER() OVER (
PARTITION BY store_id
ORDER BY sale_value DESC
) AS sale_rank
FROM sale_values
)
SELECT
rs.sale_id,
rs.sale_date,
st.store_name,
p.product_name,
rs.sale_value
FROM ranked_sales rs
JOIN stores st
ON rs.store_id = st.store_id
JOIN products p
ON rs.product_id = p.product_id
WHERE rs.sale_rank = 1
ORDER BY rs.sale_value DESC;
WITH monthly_sales AS (
SELECT
DATE_FORMAT(s.sale_date, '%Y-%m-01') AS sales_month,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY DATE_FORMAT(s.sale_date, '%Y-%m-01')
),
monthly_growth AS (
SELECT
sales_month,
revenue,
LAG(revenue) OVER (
ORDER BY sales_month
) AS previous_month_revenue
FROM monthly_sales
)
SELECT
sales_month,
revenue,
previous_month_revenue,
ROUND(
revenue - previous_month_revenue,
2
) AS revenue_change,
ROUND(
(
(revenue - previous_month_revenue)
/ previous_month_revenue
) * 100,
2
) AS growth_percentage
FROM monthly_growth
ORDER BY sales_month;
WITH monthly_sales AS (
SELECT
DATE_FORMAT(s.sale_date, '%Y-%m-01') AS sales_month,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY DATE_FORMAT(s.sale_date, '%Y-%m-01')
)
SELECT
sales_month,
revenue,
ROUND(
SUM(revenue) OVER (
ORDER BY sales_month
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
),
2
) AS running_total_revenue
FROM monthly_sales
ORDER BY sales_month;
WITH monthly_sales AS (
SELECT
YEAR(s.sale_date) AS sales_year,
MONTH(s.sale_date) AS sales_month,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN products p
ON s.product_id = p.product_id
GROUP BY
YEAR(s.sale_date),
MONTH(s.sale_date)
)
SELECT
sales_month,
MAX(
CASE
WHEN sales_year = 2024 THEN revenue
END
) AS revenue_2024,
MAX(
CASE
WHEN sales_year = 2025 THEN revenue
END
) AS revenue_2025,
ROUND(
(
MAX(
CASE
WHEN sales_year = 2025 THEN revenue
END
)
-
MAX(
CASE
WHEN sales_year = 2024 THEN revenue
END
)
)
/
MAX(
CASE
WHEN sales_year = 2024 THEN revenue
END
) * 100,
2
) AS yoy_growth_percentage
FROM monthly_sales
GROUP BY sales_month
ORDER BY sales_month;
WITH employee_sales AS (
SELECT
e.employee_id,
e.employee_name,
st.store_name,
ROUND(
SUM(
p.selling_price
* s.quantity
* (1 - s.discount / 100)
),
2
) AS revenue
FROM sales s
JOIN employees e
ON s.employee_id = e.employee_id
JOIN stores st
ON e.store_id = st.store_id
JOIN products p
ON s.product_id = p.product_id
GROUP BY
e.employee_id,
e.employee_name,
st.store_name
),
ranked_employees AS (
SELECT
employee_id,
employee_name,
store_name,
revenue,
RANK() OVER (
ORDER BY revenue DESC
) AS employee_rank
FROM employee_sales
)
SELECT
employee_id,
employee_name,
store_name,
revenue,
employee_rank
FROM ranked_employees
WHERE employee_rank <= 5
ORDER BY employee_rank;