-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIdolEshop-Dostal-querries-solutions-MySQL8.x.sql
353 lines (329 loc) · 14.5 KB
/
IdolEshop-Dostal-querries-solutions-MySQL8.x.sql
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
-- 1. Vypište všechna kontaktní místa IDOL, která vyrobila alespoň jednu opuscard kartu. Každou pobočku vypište ve formátu: NazevPobocky, NazevMesta, NazevUlice, CisloPopisne. Součástí výpisu můžou být i zrušené pobočky.
SELECT DISTINCT
BranchOffice.branchOfficeName AS NazevPobocky,
City.`name` AS NazevMesta,
BranchOffice.branchOfficeAddressStreetName AS NazevUlice,
BranchOffice.branchOfficeAddressBuildingRegistryNumber AS CisloPopisne
FROM BranchOffice
INNER JOIN OpuscardOrder ON
(BranchOffice.branchOfficeId = OpuscardOrder.opuscardProductionBranchOfficeId)
INNER JOIN City ON
(City.cityPostCode = BranchOffice.branchOfficeAddressCityPostCode);
-- 2. Vypište všechny časové kupóny, které byly úspěšně zaplaceny a zároveň zakoupeny v letech 2019 a výše. Pro každý kupón vypište ve formátu: CisloOpuscard, EmailMajiteleOpuscard, IdKuponu, DatumCasZaplaceniKuponu, CenaKuponu, CisloObjednavky.
SELECT
Opuscard.opuscardNumber AS CisloOpuscard,
TimeCoupon.registeredAccountEmail AS EmailMajiteleOpuscard,
TimeCoupon.timeCouponId AS IdKuponu,
TimeCouponOrder.paymentDate AS DatumCasZaplaceniKuponu,
TimeCoupon.price AS CenaKuponu,
TimeCouponOrder.timeCouponOrderNumber AS CisloObjednavky
FROM TimeCoupon
INNER JOIN TimeCouponOrder ON
(
TimeCouponOrder.timeCouponOrderNumber = TimeCoupon.timeCouponOrderNumber AND
TimeCouponOrder.paymentDate IS NOT NULL AND
TimeCouponOrder.paymentDate >= '2019-01-01 00:00:00'
)
INNER JOIN Opuscard ON
(Opuscard.opuscardNumber = TimeCoupon.opuscardNumber);
-- 3. Vypište všechny uživatele s potvrzeným emailem a zároveň potvrzeným mobilem, pokud ho mají, kteří mají vybranou ověřenou tarifní kategorii obsahující "ZTP" nebo ověřenou kategorii obsahující "Důchodce" a zároveň s někým sdíleli alespoň jednou svůj účet. Pro každého uživatele vypište ve formátu: EmailUzivatele, Jmeno, Prijmeni.
SELECT DISTINCT
RegisteredAccount.registeredAccountEmail AS EmailUzivatele,
RegisteredAccount.forename AS Jmeno,
RegisteredAccount.surname AS Prijmeni
FROM RegisteredAccountTarifCategory
INNER JOIN TarifCategory ON
(
TarifCategory.tarifCategoryId = RegisteredAccountTarifCategory.tarifCategoryId AND
(TarifCategory.tarifCategoryName LIKE '%ZTP%' OR TarifCategory.tarifCategoryName LIKE '%Důchodce%') AND
RegisteredAccountTarifCategory.isTarifCategoryValid = 1
)
INNER JOIN RegisteredAccount ON
(
RegisteredAccount.registeredAccountEmail = RegisteredAccountTarifCategory.registeredAccountEmail AND
RegisteredAccount.isEmailConfirmed = 1 AND
(RegisteredAccount.registeredAccountPhone IS NULL OR RegisteredAccount.isPhoneConfirmed = 1)
)
INNER JOIN RegisteredAccountSharedWith ON
(RegisteredAccount.registeredAccountEmail = RegisteredAccountSharedWith.linkedSourceRegisteredAccountEmail);
-- 4. Vypište všechna města, ve kterých si uživatelé veřejné dopravy alespoň jednou reálně vyzvedli (stav objednávky: "Karta obdržena") opuscard kartu na pobočce. Zahrňte i zrušené pobočky. Vypište ve formátu: NazevMesta, PSC.
SELECT DISTINCT
City.`name` AS NazevMesta,
City.cityPostCode AS PSC
FROM BranchOffice
INNER JOIN OpuscardOrder ON
(BranchOffice.branchOfficeId = OpuscardOrder.opuscardPickUpBranchOfficeId)
INNER JOIN OpuscardOrderState ON
(
OpuscardOrderState.opuscardOrderStateId = OpuscardOrder.opuscardOrderStateId AND
OpuscardOrderState.opuscardOrderStateName = 'Karta obdržena'
)
INNER JOIN City ON
(City.cityPostCode = BranchOffice.branchOfficeAddressCityPostCode);
-- 5. Vypište všechny pobočky, které vyrobily alespoň jednu kartu a zároveň si je nikdo nikdy nevybral jako výdejní místo pro vyrobenou kartu. Zahrňte i zrušené pobočky. Pro každou pobočku napište i počet vyrobených karet. Následně seřaďte podle počtu vyrobených karet sestupně a vypište ve formátu: NazevPobocky, NazevMesta, NazevUlice, CisloPopisne, PocetVyrobenychKaret. Nesmí se použít JOIN.
SELECT
BranchOffice.branchOfficeName AS NazevPobocky,
(
SELECT City.`name`
FROM City
WHERE City.cityPostCode = BranchOffice.branchOfficeAddressCityPostCode
)
AS NazevMesta,
BranchOffice.branchOfficeAddressStreetName AS NazevUlice,
BranchOffice.branchOfficeAddressBuildingRegistryNumber AS CisloPopisne,
(
SELECT COUNT(*)
FROM OpuscardOrder
WHERE OpuscardOrder.opuscardProductionBranchOfficeId = BranchOffice.branchOfficeId
)
AS PocetVyrobenychKaret
FROM BranchOffice
WHERE BranchOffice.branchOfficeId IN
(
SELECT DISTINCT OpuscardOrder.opuscardProductionBranchOfficeId
FROM OpuscardOrder
WHERE OpuscardOrder.opuscardProductionBranchOfficeId IS NOT NULL
EXCEPT
SELECT DISTINCT OpuscardOrder.opuscardPickUpBranchOfficeId
FROM OpuscardOrder
WHERE OpuscardOrder.opuscardPickUpBranchOfficeId IS NOT NULL
)
ORDER BY PocetVyrobenychKaret DESC;
-- 6. Vypište informaci, kolik uživatelů s potvrzeným emailem a zároveň potvrzeným mobilem, pokud ho mají, má validní tarifní kategorii "Držitel ZTP/P a ZTP" a zároveň platnou tarifní kategorii "Student -26". Nepoužívejte JOINY ani množinové operace ani ručně zadané ID. Vypište ve formátu: PocetStudujicichUzivateluSeZTP.
SELECT COUNT(*) AS PocetStudujicichUzivateluSeZTP
FROM RegisteredAccount
WHERE
RegisteredAccount.isEmailConfirmed = 1 AND
(RegisteredAccount.registeredAccountPhone IS NULL OR RegisteredAccount.isPhoneConfirmed = 1) AND
RegisteredAccount.registeredAccountEmail IN
(
SELECT R1.registeredAccountEmail
FROM RegisteredAccountTarifCategory R1
WHERE
R1.tarifCategoryId =
(
SELECT TarifCategory.tarifCategoryId
FROM TarifCategory
WHERE TarifCategory.tarifCategoryName = 'Držitel ZTP/P a ZTP'
)
AND
R1.isTarifCategoryValid = 1
AND
R1.registeredAccountEmail IN
(
SELECT R2.registeredAccountEmail
FROM RegisteredAccountTarifCategory R2
WHERE
R2.tarifCategoryId =
(
SELECT TarifCategory.tarifCategoryId
FROM TarifCategory
WHERE TarifCategory.tarifCategoryName = 'Student -26'
)
AND
R2.isTarifCategoryValid = 1
)
);
-- 7. Zjistěte, který typ časového kupónu (7denní, 30denní, atd.) v kombinaci s tarifní kategorií, je nejprodávanější za celou dobu. Využijte agregační funkci COUNT a GROUP BY a vypište všechny uživateli dosud vybrané kombinace typů kupónů a tarifních kategorií s počtem prodejů, následně seřaďte sestupně podle počtu prodejů. Prodej je myšleno, že kupón byl zaplacen. Tedy formát je: TypKuponuDny, NazevTarifniKategorie, PocetProdeju.
SELECT
ProdaneCasoveKupony.timeCouponTypeDaysCount AS TypKuponuDny,
(
SELECT TarifCategory.tarifCategoryName
FROM TarifCategory
WHERE TarifCategory.tarifCategoryId = ProdaneCasoveKupony.tarifCategoryId
)
AS NazevTarifniKategorie,
COUNT(*) AS PocetProdeju
FROM
(
SELECT
TimeCoupon.tarifCategoryId,
TimeCoupon.timeCouponTypeDaysCount
FROM TimeCoupon
WHERE TimeCoupon.timeCouponOrderNumber IN
(
SELECT TimeCouponOrder.timeCouponOrderNumber
FROM TimeCouponOrder
WHERE TimeCouponOrder.paymentDate IS NOT NULL
)
) ProdaneCasoveKupony
GROUP BY
ProdaneCasoveKupony.timeCouponTypeDaysCount,
ProdaneCasoveKupony.tarifCategoryId
ORDER BY PocetProdeju DESC;
-- 8. Vypište pro každého uživatele, který je ve spojení s jiným uživatelem či uživateli, kolik ovládá uživatelů. Poté seřaďte sestupně dle počtu ovládaných uživatelů. Vypište ve formátu: EmailUzivatele, Jmeno, Prijmeni, PocetOvladanychUzivatelu.
SELECT
OvladajiciUzivatele.linkedDestinationRegisteredAccountEmail AS EmailUzivatele,
OvladajiciUzivatele.forename AS Jmeno,
OvladajiciUzivatele.surname AS Prijmeni,
COUNT(OvladajiciUzivatele.linkedDestinationRegisteredAccountEmail) AS PocetOvladanychUzivatelu
FROM
(
SELECT DISTINCT
RegisteredAccountSharedWith.linkedDestinationRegisteredAccountEmail,
(
SELECT RegisteredAccount.forename
FROM RegisteredAccount
WHERE RegisteredAccount.registeredAccountEmail = RegisteredAccountSharedWith.linkedDestinationRegisteredAccountEmail
) AS forename,
(
SELECT RegisteredAccount.surname
FROM RegisteredAccount
WHERE RegisteredAccount.registeredAccountEmail = RegisteredAccountSharedWith.linkedDestinationRegisteredAccountEmail
) AS surname
FROM RegisteredAccountSharedWith
) OvladajiciUzivatele
INNER JOIN RegisteredAccountSharedWith ON
(OvladajiciUzivatele.linkedDestinationRegisteredAccountEmail = RegisteredAccountSharedWith.linkedDestinationRegisteredAccountEmail)
GROUP BY
OvladajiciUzivatele.linkedDestinationRegisteredAccountEmail,
OvladajiciUzivatele.forename,
OvladajiciUzivatele.surname
ORDER BY PocetOvladanychUzivatelu DESC;
-- 9. Vypište tarifní zóny, do kterých vede tři a více spojů. Pokuste se napsat dotaz bez použití HAVING nebo bez COUNT. Pozor na celosíťovku (TarifZoneNumber: "9999"). Vypište ve formátu: CisloZony, NazevZony.
SELECT
(
SELECT TZ.tarifZoneNumber
FROM TarifZone TZ
WHERE TarifniZony_Tri_A_Vice_Vstupnich_Spoju.connectedDestinationTarifZoneNumber = TZ.tarifZoneNumber
)
AS CisloZony,
(
SELECT TZ.tarifZoneName
FROM TarifZone TZ
WHERE TarifniZony_Tri_A_Vice_Vstupnich_Spoju.connectedDestinationTarifZoneNumber = TZ.tarifZoneNumber
)
AS NazevZony
FROM
(
SELECT DISTINCT T1.connectedDestinationTarifZoneNumber
FROM TarifZoneConnectedWith T1
INNER JOIN TarifZoneConnectedWith T2 ON
(
T1.connectedDestinationTarifZoneNumber = T2.connectedDestinationTarifZoneNumber AND
T2.connectedDestinationTarifZoneNumber <> T1.connectedSourceTarifZoneNumber AND
T1.connectedSourceTarifZoneNumber < T2.connectedSourceTarifZoneNumber
)
INNER JOIN TarifZoneConnectedWith T3 ON
(
T2.connectedDestinationTarifZoneNumber = T3.connectedDestinationTarifZoneNumber AND
T3.connectedDestinationTarifZoneNumber <> T1.connectedSourceTarifZoneNumber AND
T3.connectedDestinationTarifZoneNumber <> T2.connectedSourceTarifZoneNumber AND
T1.connectedSourceTarifZoneNumber < T3.connectedSourceTarifZoneNumber AND
T2.connectedSourceTarifZoneNumber < T3.connectedSourceTarifZoneNumber
)
) TarifniZony_Tri_A_Vice_Vstupnich_Spoju;
-- 10. Vypište pro každou tarifní kategorii, kolik celkově reálně zaplatili uživatelé za objednávky opuscard. Do výsledku započítavejte pouze objednávky uživatelů, kteří mají všechny své vybrané kategorie platné. Zahrňte i tarifní kategorie s nulovou celkovou cenou taky do výpisu. Následně seřaďte sestupně podle celkové ceny. Formát výpisu je: NazevTarifniKategorie, CelkovaCenaObjednavekOpuscard.
SELECT
TarifCategory.tarifCategoryName AS NazevTarifniKategorie,
IFNULL(SUM(ProdaneObjednavkyOpuscard.price), 0) AS CelkovaCenaObjednavekOpuscard
FROM TarifCategory
LEFT JOIN
(
SELECT
R1.tarifCategoryId,
OpuscardOrder.price
FROM RegisteredAccountTarifCategory R1
INNER JOIN RegisteredAccount ON
(
RegisteredAccount.registeredAccountEmail = R1.registeredAccountEmail AND
NOT EXISTS
(
SELECT RegisteredAccountTarifCategory.tarifCategoryId
FROM RegisteredAccountTarifCategory
WHERE
RegisteredAccount.registeredAccountEmail = RegisteredAccountTarifCategory.registeredAccountEmail AND
RegisteredAccountTarifCategory.isTarifCategoryValid = 0
)
)
INNER JOIN OpuscardOrder ON
(
OpuscardOrder.registeredAccountEmail = RegisteredAccount.registeredAccountEmail AND
OpuscardOrder.paymentDate IS NOT NULL
)
)
ProdaneObjednavkyOpuscard ON
(TarifCategory.tarifCategoryId = ProdaneObjednavkyOpuscard.tarifCategoryId)
GROUP BY TarifCategory.tarifCategoryName
ORDER BY CelkovaCenaObjednavekOpuscard DESC;
-- 11. Vypište tarifní zóny, do kterých vede spoj či spoje, které se skládají z tří a více mezicest. Nejsou povoleny mezicesty, které tvoří uzavřenou kružnici v rámci grafu. Pozor na celosíťovku (TarifZoneNumber: "9999"). Pokuste se napsat dotaz bez použití HAVING nebo bez COUNT. Vypište ve formátu: CisloZony, NazevZony.
SELECT
(
SELECT TZ.tarifZoneNumber
FROM TarifZone TZ
WHERE TarifniZony_Tri_A_Vice_MeziCest.connectedDestinationTarifZoneNumber = TZ.tarifZoneNumber
)
AS CisloZony,
(
SELECT TZ.tarifZoneName
FROM TarifZone TZ
WHERE TarifniZony_Tri_A_Vice_MeziCest.connectedDestinationTarifZoneNumber = TZ.tarifZoneNumber
)
AS NazevZony
FROM
(
SELECT DISTINCT T1.connectedDestinationTarifZoneNumber
FROM TarifZoneConnectedWith T1
INNER JOIN TarifZoneConnectedWith T2 ON
(
T1.connectedSourceTarifZoneNumber = T2.connectedDestinationTarifZoneNumber AND
T1.connectedDestinationTarifZoneNumber <> T2.connectedSourceTarifZoneNumber
)
INNER JOIN TarifZoneConnectedWith T3 ON
(
T2.connectedSourceTarifZoneNumber = T3.connectedDestinationTarifZoneNumber AND
T2.connectedDestinationTarifZoneNumber <> T3.connectedSourceTarifZoneNumber AND
T1.connectedDestinationTarifZoneNumber <> T3.connectedSourceTarifZoneNumber
)
) TarifniZony_Tri_A_Vice_MeziCest;
-- 12. Najděte rozdíl mezi průměrnou cenou objednávek časových kupónů zakoupených před rokem 2020 a průměrnou cenu objednávek časových kupónů zakoupených od roku 2020. Ujistěte se, že jste spočítali průměrnou cenu nejdříve pro každou objednávku časových kupónů a pak průměr těchto průměrů před rokem 2020 a po roce 2020. Vypište ve formátu: RozdilPrumernychCenObjednavekKuponuPred_2020_Po_2020.
SELECT
(
SELECT
(
SELECT AVG(prumerne_ceny_objednavky_kuponu.prumerna_cena)
FROM
(
SELECT
TC.timeCouponOrderNumber AS timeCouponOrderNumber,
(
SELECT TimeCouponOrder.paymentDate
FROM TimeCouponOrder
WHERE TimeCouponOrder.timeCouponOrderNumber = TC.timeCouponOrderNumber
) AS datumCasPlatby,
AVG(TC.price) AS prumerna_cena
FROM TimeCoupon TC
WHERE TC.timeCouponOrderNumber IN
(
SELECT TimeCouponOrder.timeCouponOrderNumber
FROM TimeCouponOrder
WHERE TimeCouponOrder.paymentDate IS NOT NULL
)
GROUP BY TC.timeCouponOrderNumber
) prumerne_ceny_objednavky_kuponu
WHERE prumerne_ceny_objednavky_kuponu.datumCasPlatby < '2020-01-01 00:00:00'
) -
(
SELECT AVG(prumerne_ceny_objednavky_kuponu.prumerna_cena)
FROM
(
SELECT
TC.timeCouponOrderNumber AS timeCouponOrderNumber,
(
SELECT TimeCouponOrder.paymentDate
FROM TimeCouponOrder
WHERE TimeCouponOrder.timeCouponOrderNumber = TC.timeCouponOrderNumber
) AS datumCasPlatby,
AVG(TC.price) AS prumerna_cena
FROM TimeCoupon TC
WHERE TC.timeCouponOrderNumber IN
(
SELECT TimeCouponOrder.timeCouponOrderNumber
FROM TimeCouponOrder
WHERE TimeCouponOrder.paymentDate IS NOT NULL
)
GROUP BY TC.timeCouponOrderNumber
) prumerne_ceny_objednavky_kuponu
WHERE prumerne_ceny_objednavky_kuponu.datumCasPlatby >= '2020-01-01 00:00:00'
)
) AS RozdilPrumernychCenObjednavekKuponuPred_2020_Po_2020;