-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathrecap1.sql
396 lines (320 loc) · 7.19 KB
/
recap1.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
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
396
1.
SELECT *
FROM (
SELECT e.denumire
FROM excursie e
INNER JOIN achizitioneaza a
ON e.id_excursie = a.cod_excursie
ORDER BY data_achizitie
)
WHERE ROWNUM = 1;
2.
SELECT cod_excursie, COUNT(1)
FROM achizitioneaza
GROUP BY cod_excursie;
3.
WITH nr_excursii AS (
SELECT
ag.denumire, ag.oras,
COUNT(1) AS nr_excursii
FROM agentie ag
INNER JOIN excursie ex
ON ex.cod_agentie = ag.id_agentie
GROUP BY ag.denumire, ag.oras),
pret_mediu AS (
SELECT
ag.denumire, ag.oras,
AVG(ex.pret) AS pret_mediu
FROM agentie ag
INNER JOIN excursie ex
ON ex.cod_agentie = ag.id_agentie
INNER JOIN achizitioneaza ac
ON ac.cod_excursie = ex.id_excursie
GROUP BY ag.denumire, ag.oras)
SELECT denumire, oras, nr_excursii, pret_mediu
FROM nr_excursii
INNER JOIN pret_mediu
USING (denumire, oras);
4.
WITH nr_excursii AS (
SELECT t.nume, t.prenume, COUNT(1) AS nr
FROM turist t
INNER JOIN achizitioneaza a
ON t.id_turist = a.cod_turist
GROUP BY t.nume, t.prenume)
SELECT nume, prenume
FROM nr_excursii
WHERE nr >= 2;
WITH nr_excursii AS (
SELECT t.nume, t.prenume, COUNT(1) AS nr
FROM turist t
INNER JOIN achizitioneaza a
ON t.id_turist = a.cod_turist
GROUP BY t.nume, t.prenume)
SELECT COUNT(1) AS nr_turisti
FROM nr_excursii;
5.
WITH turisti_paris AS (
SELECT *
FROM turist t
INNER JOIN achizitioneaza a
ON t.id_turist = a.cod_turist
INNER JOIN excursie e
ON a.cod_excursie = e.id_excursie
WHERE e.destinatie LIKE 'Paris')
SELECT *
FROM turist
WHERE (nume, prenume) NOT IN (
SELECT nume, prenume
FROM turisti_paris);
6.
SELECT id_turist, nume, prenume
FROM turist t1
WHERE 2 <= (
SELECT COUNT(DISTINCT destinatie)
FROM turist t2
INNER JOIN achizitioneaza
ON t2.id_turist = cod_turist
INNER JOIN excursie
ON id_excursie = cod_excursie
WHERE t1.id_turist = t2.id_turist
);
7.
SELECT
denumire,
NVL(
(SELECT SUM(pret - pret * NVL(discount, 0)) AS profit
FROM achizitioneaza
INNER JOIN excursie
ON cod_excursie = id_excursie
WHERE cod_agentie = id_agentie),
0) AS profit
FROM agentie;
8.
SELECT denumire, oras
FROM agentie
WHERE 3 <= (
SELECT COUNT(1)
FROM excursie
WHERE cod_agentie = id_agentie AND pret < 2000
);
9.
SELECT id_excursie, denumire
FROM excursie
WHERE id_excursie NOT IN (
SELECT DISTINCT cod_excursie
FROM achizitioneaza
);
10.
SELECT
e.denumire AS denumire_excursie,
e.pret,
NVL(a.denumire, 'agentie necunoscuta') AS denumire_agentie
FROM excursie e
LEFT OUTER JOIN agentie a
ON e.cod_agentie = a.id_agentie;
11.
SELECT denumire, pret
FROM excursie
WHERE pret > (
SELECT pret
FROM excursie
WHERE denumire LIKE 'Orasul luminilor' AND cod_agentie = 10
);
12.
SELECT nume, prenume, (data_end - data_start) AS durata
FROM turist
INNER JOIN achizitioneaza
ON id_turist = cod_turist
WHERE (data_end - data_start) >= 10;
13.
SELECT DISTINCT id_excursie
FROM excursie
INNER JOIN achizitioneaza
ON cod_excursie = id_excursie
INNER JOIN turist
ON cod_turist = id_turist
WHERE (SYSDATE - data_nastere)/365.25 <= 35;
14.
SELECT nume, prenume
FROM turist
WHERE id_turist NOT IN (
SELECT DISTINCT id_turist
FROM turist
INNER JOIN achizitioneaza
ON cod_turist = id_turist
INNER JOIN excursie
ON cod_excursie = id_excursie
INNER JOIN agentie
ON cod_agentie = id_agentie
WHERE oras LIKE 'Bucuresti'
);
15.
SELECT nume, prenume
FROM turist
WHERE id_turist IN (
SELECT DISTINCT id_turist
FROM turist
INNER JOIN achizitioneaza
ON cod_turist = id_turist
INNER JOIN excursie
ON cod_excursie = id_excursie
INNER JOIN agentie
ON cod_agentie = id_agentie
WHERE (excursie.denumire LIKE '%1 Mai%') AND (agentie.oras LIKE 'Bucuresti')
);
16.
SELECT nume, prenume, excursie.denumire
FROM turist
INNER JOIN achizitioneaza
ON cod_turist = id_turist
INNER JOIN excursie
ON cod_excursie = id_excursie
INNER JOIN agentie
ON cod_agentie = id_agentie
WHERE agentie.denumire LIKE 'Smart Tour';
17.
SELECT *
FROM (
SELECT id_excursie, nr_locuri, COUNT(1) AS locuri_ocupate
FROM achizitioneaza
INNER JOIN excursie
ON cod_excursie = id_excursie
WHERE data_start = '14-AUG-2011'
GROUP BY id_excursie, nr_locuri
) nr_locuri
WHERE nr_locuri = locuri_ocupate;
18.
WITH date_achizitie AS (
SELECT id_turist, id_excursie, data_achizitie
FROM excursie
INNER JOIN achizitioneaza
ON cod_excursie = id_excursie
INNER JOIN turist
ON cod_turist = id_turist
ORDER BY data_achizitie DESC
)
SELECT id_turist, MAX(data_achizitie)
FROM date_achizitie
GROUP BY id_turist
ORDER BY id_turist;
19.
SELECT *
FROM (
SELECT denumire, pret
FROM excursie
ORDER BY pret DESC
) top_excursii
WHERE ROWNUM <= 5;
20.
SELECT nume, prenume
FROM turist
INNER JOIN achizitioneaza
ON id_turist = cod_turist
WHERE TO_CHAR(data_achizitie, 'MON') = TO_CHAR(data_nastere, 'MON');
21.
WITH nr_persoane AS (
SELECT cod_excursie, COUNT(1) AS nr
FROM achizitioneaza
GROUP BY cod_excursie
),
doua_persoane AS (
SELECT *
FROM nr_persoane
WHERE nr = 2
)
SELECT DISTINCT nume, prenume
FROM turist
INNER JOIN achizitioneaza
ON id_turist = cod_turist
INNER JOIN doua_persoane
USING (cod_excursie)
INNER JOIN excursie
ON id_excursie = cod_excursie
INNER JOIN agentie
ON id_agentie = cod_agentie
WHERE oras LIKE 'Constanta';
22.
WITH d AS (
SELECT
id_excursie,
CASE
WHEN durata <= 5 THEN
'mica'
WHEN durata <= 19 THEN
'medie'
ELSE
'lunga'
END AS durata_text,
durata
FROM excursie
)
SELECT id_excursie, durata_text
FROM d
ORDER BY durata;
23.
WITH nr_excursii AS (
SELECT oras, COUNT(1) AS nr
FROM agentie
INNER JOIN excursie
ON id_agentie = cod_agentie
GROUP BY oras
)
SELECT
(
SELECT SUM(nr)
FROM nr_excursii
) AS "Numar excursii",
(
SELECT nr
FROM nr_excursii
WHERE oras LIKE 'Constanta'
) AS "Nr. ex Contanta",
(
SELECT nr
FROM nr_excursii
WHERE oras LIKE 'Bucuresti'
) AS "Nr. ex Bucuresti"
FROM dual;
24.
SELECT id_excursie, denumire
FROM excursie
INNER JOIN achizitioneaza
ON id_excursie = cod_excursie
INNER JOIN turist
ON id_turist = cod_turist
WHERE ROUND((SYSDATE - data_nastere) / 365.25) = 35;
25.
SELECT
id_agentie,
destinatie,
SUM(pret - pret * NVL(discount, 0)) AS profit,
GROUPING(id_agentie),
GROUPING(destinatie)
FROM agentie
INNER JOIN excursie
ON id_agentie = cod_agentie
INNER JOIN achizitioneaza
ON id_excursie = cod_excursie
GROUP BY GROUPING SETS (
(id_agentie, destinatie),
(id_agentie),
()
);
26.
WITH preturi_medii AS (
SELECT id_agentie, oras, AVG(pret) AS pret_mediu
FROM agentie
INNER JOIN excursie
ON id_agentie = cod_agentie
GROUP BY id_agentie, oras
)
SELECT
agentie.oras,
agentie.id_agentie,
preturi_medii.id_agentie AS id_concurent,
preturi_medii.pret_mediu AS pret_mediu_concurent
FROM agentie
LEFT OUTER JOIN preturi_medii
ON agentie.oras = preturi_medii.oras
AND agentie.id_agentie != preturi_medii.id_agentie;