-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstore_database.session.sql
More file actions
257 lines (216 loc) · 7.56 KB
/
store_database.session.sql
File metadata and controls
257 lines (216 loc) · 7.56 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
/*Rozkład - liczba rejestracji w kazdym kolejnym miesiacu*/
SELECT
DATE_FORMAT(registration_date,'%Y-%m') AS registration_month,
COUNT(*) AS num_of_registrations
FROM customers
GROUP BY registration_month;
/*Liczba wypożyczeb w kazdym koeljnym miesiacu*/
SELECT *
FROM rentals;
SELECT
DATE_FORMAT(rental_date, '%Y-%m') AS rental_month,
COUNT(*) AS num_of_rentals
FROM rentals
GROUP BY rental_month;
/*Wyznacz ranking na pracownika miesiąca dla każdego miesiąca,
w którym sklep prowadził sprzedaż.*/
-- jeśli rozważamy tylko sprzedaż
SELECT date, CONCAT(s.first_name, ' ', s.last_name) AS employee, sales_number
FROM (
SELECT DATE_FORMAT(date,'%Y-%m') AS date, staff_id, COUNT(purchase_id) AS sales_number,
ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(date,'%Y-%m') ORDER BY COUNT(purchase_id) DESC) AS row_num
FROM purchases
GROUP BY DATE_FORMAT(date,'%Y-%m'), staff_id
) AS subquery
LEFT JOIN staff AS s USING(staff_id)
WHERE row_num = 1
ORDER BY date, sales_number DESC;
SELECT employee, COUNT(*) AS how_often
FROM (SELECT date, CONCAT(s.first_name, ' ', s.last_name) AS employee, sales_number
FROM (
SELECT DATE_FORMAT(date,'%Y-%m') AS date, staff_id, COUNT(purchase_id) AS sales_number,
ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(date,'%Y-%m') ORDER BY COUNT(purchase_id) DESC) AS row_num
FROM purchases
GROUP BY DATE_FORMAT(date,'%Y-%m'), staff_id
) AS subquery
LEFT JOIN staff AS s USING(staff_id)
WHERE row_num = 1
ORDER BY date, sales_number DESC) AS tab
GROUP BY employee
ORDER BY COUNT(*) DESC
LIMIT 1;
SELECT *
FROM games;
SELECT (date), employee, MAX(sales_number) AS max_sales
FROM (SELECT date, CONCAT(s.first_name, ' ', s.last_name) AS employee, sales_number
FROM (
SELECT DATE_FORMAT(date,'%Y-%m') AS date, staff_id, COUNT(purchase_id) AS sales_number,
ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(date,'%Y-%m') ORDER BY COUNT(purchase_id) DESC) AS row_num
FROM purchases
GROUP BY DATE_FORMAT(date,'%Y-%m'), staff_id
) AS subquery
LEFT JOIN staff AS s USING(staff_id)
WHERE row_num = 1
ORDER BY date, sales_number DESC) AS subquery;
/*Sporządź analizę top 10 zawodników turniejowych w zależności
od gry. */
SELECT g.name AS game, CONCAT(c.first_name, ' ', c.last_name) AS player, score
FROM (
SELECT t.game_id, customer_id, SUM(score) AS score,
ROW_NUMBER() OVER (PARTITION BY game_id ORDER BY SUM(score) DESC) AS row_num
FROM tournament_results AS results
LEFT JOIN tournament AS t USING(tournament_id)
GROUP BY game_id, customer_id
) AS subquery
LEFT JOIN customers AS c USING(customer_id)
LEFT JOIN games AS g USING(game_id)
WHERE row_num IN (1,2,3,4,5,6,7,8,9,10)
AND game_id IN (
SELECT game_id FROM (
SELECT DISTINCT game_id FROM tournament ORDER BY RAND() LIMIT 3
) AS random_games
)
ORDER BY game_id, score DESC;
SELECT g.name AS game, CONCAT(c.first_name, ' ', c.last_name) AS player, score
FROM (
SELECT t.game_id, customer_id, SUM(score) AS score
FROM tournament_results AS results
LEFT JOIN tournament AS t USING(tournament_id)
WHERE t.game_id IN (
SELECT DISTINCT game_id
FROM tournament
ORDER BY RAND()
LIMIT 3
)
GROUP BY game_id, customer_id
) AS subquery
LEFT JOIN customers AS c USING(customer_id)
LEFT JOIN games AS g USING(game_id)
ORDER BY game_id, score DESC;
SELECT game_id FROM (
SELECT game_id FROM tournament ORDER BY RAND() LIMIT 3
) AS random_games
/*Gracz z największa liczba punktow za wszystkie turnieje*/
SELECT CONCAT(c.first_name, ' ', c.last_name) AS player, SUM(r.score) AS total_score
FROM tournament_results AS r
LEFT JOIN customers AS c USING(customer_id)
GROUP BY player
ORDER BY total_score DESC
LIMIT 1;
/*Ustal, które gry przynoszą największy dochód ze sprzedaży,
a które z wypożyczeń.*/
-- wypozyczenia
SELECT g.name AS game, ROUND(SUM(r.price + r.fine) - 0.7*r.price*15,2) AS rental_income, COUNT(r.rental_id)
FROM rentals AS r
LEFT JOIN inventory_rent AS i USING(inventory_id)
LEFT JOIN games AS g ON i.game_id = g.game_id
GROUP BY g.name
ORDER BY rental_income DESC
LIMIT 3;
-- kupna
SELECT g.name AS game, ROUND(SUM(i.price - 0.7*i.price) , 2) AS buy_income, COUNT(p.purchase_id)
FROM purchases AS p
LEFT JOIN inventory_buy AS i USING(inventory_id)
LEFT JOIN games AS g ON i.game_id = g.game_id
GROUP BY g.name
ORDER BY buy_income DESC
LIMIT 3;
/*Skąd są klienci? wrocław, dolnoslaskie, reszta polski */
SELECT *
FROM customers;
-- osoby z wrocławia
SELECT COUNT(c.customer_id) AS num_of_customers
FROM customers AS c
LEFT JOIN addresses AS a USING(address_id)
WHERE a.city = 'Wrocław'
GROUP BY a.city;
-- dolnośląskie
SELECT COUNT(c.customer_id) AS num_of_customers
FROM customers AS c
LEFT JOIN addresses AS a USING(address_id)
WHERE (a.city <> 'Wrocław') AND
(a.postal_code REGEXP '^50|^51|^52|^53|^54|^55|^56|^57|^58|^59|^67-2');
-- reszta
SELECT COUNT(c.customer_id) AS num_of_customers
FROM customers AS c
LEFT JOIN addresses AS a USING(address_id)
WHERE (a.city <> 'Wrocław') AND
(a.postal_code NOT REGEXP '^50|^51|^52|^53|^54|^55|^56|^57|^58|^59|^67-2');
63 164 372
WITH tab AS (
SELECT c.customer_id, a.city, CASE WHEN a.city = 'Wrocław' THEN 'Wrocław'
WHEN (a.city <> 'Wrocław') AND
(a.postal_code REGEXP '^50|^51|^52|^53|^54|^55|^56|^57|^58|^59|^67-2')
THEN 'Dolnośląskie'
WHEN (a.city <> 'Wrocław') AND
(a.postal_code NOT REGEXP '^50|^51|^52|^53|^54|^55|^56|^57|^58|^59|^67-2')
THEN 'reszta'
END AS region
FROM customers as c
LEFT JOIN addresses AS a USING(address_id))
/*
SELECT region, COUNT(*)
FROM tab
GROUP BY region;*/
SELECT *
FROM tab WHERE region IS NULL;
SELECT *
FROM customers
WHERE customer_id = 433;
/* Klienci, którzy wydali najmniej i najwięcej hajsu łącznie w sklepie
(i wypozyczenia i kupna)*/
--TRZEBA JESZCZE WZIAC PIERWSZY I OSTATNI WIERSZ
-- ALE DLUGO MULI WIEC JAK MACIE JAKIS INNY POMYSL NA TO TO PROSZE BARDZO
SELECT c.customer_id, ROUND(SUM(r.price + r.fine + i.price), 2) AS money_spend
FROM customers AS c
LEFT JOIN rentals AS r ON c.customer_id = r.customer_id
LEFT JOIN purchases AS p ON c.customer_id = p.customer_id
LEFT JOIN inventory_buy AS i ON p.inventory_id = i.inventory_id
GROUP BY c.customer_id
ORDER BY money_spend;
SELECT c.customer_id
FROM customers AS c
LEFT JOIN rentals AS r ON c.customer_id = r.customer_id
LEFT JOIN purchases AS p ON c.customer_id = p.customer_id
WHERE r.r
GROUP BY c.customer_id
/*5. Jak często wypożyczane są gry droższe niż średnia cena w sklepie
a jak często tańsze. (np. liczba wypożyczen drozszych gier przez liczbe
gier drozszych jakie posiada sklep)*/
WITH inv_ids AS (
SELECT
CASE WHEN inventory_id IN (SELECT inventory_id
FROM inventory_rent
WHERE price > (SELECT ROUND(AVG(price),2)
FROM inventory_rent)) THEN 'droższe'
CASE WHEN inventory_id IN (SELECT inventory_id
FROM inventory_rent
WHERE price <= (SELECT ROUND(AVG(price),2)
FROM inventory_rent)) THEN 'tańsze'
END AS czy_drozsze
FROM rentals
)
SELECT
CASE WHEN inventory_id IN (SELECT inventory_id
FROM inventory_rent
WHERE price > (SELECT ROUND(AVG(price),2)
FROM inventory_rent)) THEN 'droższe'
CASE WHEN inventory_id IN (SELECT inventory_id
FROM inventory_rent
WHERE price <= (SELECT ROUND(AVG(price),2)
FROM inventory_rent)) THEN 'tańsze'
END AS czy_drozsze
FROM rentals;
SELECT COUNT(*)
FROM inv_ids
GROUP BY czy_drozsze;
-- gry drozsze niz srednia cena
SELECT inventory_id
FROM inventory_rent
WHERE price > (SELECT ROUND(AVG(price),2)
FROM inventory_rent);
--gry tansze lub rowne sredniej cenie
SELECT inventory_id
FROM inventory_rent
WHERE price <= (SELECT ROUND(AVG(price),2)
FROM inventory_rent);