-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuestions.sql
More file actions
389 lines (326 loc) · 10 KB
/
Questions.sql
File metadata and controls
389 lines (326 loc) · 10 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
USE kupatcholim;
GO
-- ôøåöãåøä ùîðñä ìäëðéñ øåôà çãù ìîòøëú
alter PROCEDURE enterdoctor
@first_name VARCHAR(20),
@last_name VARCHAR(20),
@phone VARCHAR(15),
@specialty VARCHAR(50),
@working_hours VARCHAR(50)
AS
BEGIN
BEGIN TRY
IF NOT EXISTS (SELECT 1 FROM doctors WHERE phone = @phone)
BEGIN
INSERT INTO doctors (first_name, last_name, phone, specialty, working_hours)
VALUES (@first_name, @last_name, @phone, @specialty, @working_hours);
PRINT 'äøåôà ðåñó áäöìçä';
END
ELSE
BEGIN
PRINT 'äøùåîä ëáø ÷ééîú áèáìä';
END
END TRY
BEGIN CATCH
PRINT 'ùâéàä áîäìê äëðñú äðúåðéí: ' + ERROR_MESSAGE();
END CATCH
END;
GO
EXEC enterdoctor
@first_name = 'øçìé',
@last_name = 'åøðø',
@phone = '0533159911',
@specialty = 'ãé÷åø ñéðé',
@working_hours = 'øàùåï-çîéùé 08:00-16:00';
----ôøåöãøåøä ùáåã÷ú àí àôùø ì÷áåò úåø, àéê? äéà áåã÷ú àí øåôà ñôöéôé ðîöà áñðéó ùàðé øåöä åàí ëï ÷åáòú úåø
----éöéøú ôåð÷öéä ùáåã÷ú äàí äøåôà ùàðé øåöä ðîöà áñðéó ùàðé øåöä
create function dbo.fn_tor (@snif int,@doctor int)
returns int
as
begin
declare @result int
IF EXISTS (SELECT 1 FROM doctors WHERE doctor_id = @doctor AND snif_id = @snif)
SET @result = 1;
ELSE
SET @result = 0;
RETURN @result;
END;
----éöéøú äôøåöãåøä ùî÷ééîú àú äáãé÷ä
----ùéîåù áèøðæ÷öéä
CREATE PROCEDURE ScheduleAppointment
@patient_id INT,
@doctor_id INT,
@snif INT,
@appointment_time DATETIME,
@medication_id INT
AS
BEGIN
begin tran
IF dbo.fn_tor(@snif, @doctor_id) = 1
BEGIN
INSERT INTO Appointments (doctor_id, patient_id, appointment_time, medication_id)
VALUES (@doctor_id, @patient_id, @appointment_time, @medication_id);
PRINT 'äúåø ð÷áò áäöìçä';
commit
END
ELSE
BEGIN
PRINT 'îöèòøéí, àéï áàôùøåúéðå ì÷áåò úåø - äøåôà ìà òåáã áñðéó æä';
rollback
END
END;
GO
exec ScheduleAppointment
@patient_id = 6,
@doctor_id = 6,
@snif = 7,
@appointment_time = '2025-03-01 10:00',
@medication_id = null;
---ôåð÷öéä ùáåã÷ú äàí éù úøåôä ááéú äîø÷çú ìáòéä ùì äîèåôì
create function dbo.fn_medicition (@sick varchar (50))
returns varchar (50)
as
begin
declare @result varchar (50)
if exists (select 1 from medications m where m.help_for=@sick)
set @result='äúøåôä ðîöàú áîìàé'
ELSE
set @result='îöèòøéí àáì àéï'
RETURN @result;
END;
go
---drop function dbo.fn_medicition
declare @sick varchar(50)
select dbo.fn_medicition('ä÷ìú çøãä')
---ôøåöãåøä ùáåã÷ú òé ôøåöãåøä ðåñôú àéæä úøåôåú éåøãåú áîçéø ëé äú÷åó ùìäï îú÷øá
ALTER PROCEDURE pr_check_expiration_date
AS
BEGIN
-- éåöøú øùéîä ùì úøåôåú ùäúå÷ó ùìäï òáø á-10 éîéí
SELECT name
FROM medications
WHERE expiration_date <= GETDATE() - 10; -- úå÷ó ÷øåá
END;
ALTER PROCEDURE pr_update_medication_price (@medication_name VARCHAR(50))
AS
BEGIN
-- éåöøú èáìä æîðéú ì÷áìú äúåöàåú îäôøåöãåøä ä÷èðä
CREATE TABLE #TempMedications (name VARCHAR(50));
-- îëðéñ àú äðúåðéí îäôøåöãåøä ä÷èðä ìèáìä äæîðéú
INSERT INTO #TempMedications (name)
EXEC pr_check_expiration_date;
-- áåã÷ àí äúøåôä ùäåæðä ðîöàú áèáìä äæîðéú
IF EXISTS (SELECT 1 FROM #TempMedications WHERE name = @medication_name)
BEGIN
-- àí äúøåôä ðîöàú, òãëåï äîçéø
UPDATE medications
SET price = price * 0.5
WHERE name = @medication_name;
PRINT 'äîçéø òåãëï áäöìçä!';
END
ELSE
BEGIN
PRINT 'äúøåôä ìà ðîöàú áøùéîú äúøåôåú òí úå÷ó ÷øåá!';
END
END;
declare @medication_name varchar(50)
exec pr_update_medication_price @medication_name='àåôèìâéï'
select * from medications
---áãé÷ä
update medications
set price=200
where name='àåôèìâéï'
----éöéøú èøéâø ùîúáññ òì äôøåöãåøä
----åëì ôòí ùäîçéø ùì úøåôä îúòãëï
----äåà áåã÷ ùäîçéø âãåì éåúø î30 ù÷ì
---åàí æä ÷èï îäñëåí
----îòãëï àú îçéø äúøåôä ìîçéø âáåä éåúø
alter trigger tr_cheak_price_medications
on medications
for update
as
if exists (select 1 from inserted where price>=30)
select 'ä÷ðéä îàåùøú äîùê áúùìåí'
else
UPDATE medications
SET price = 100
WHERE medications_id IN (SELECT medications_id FROM inserted WHERE price < 30);
go
----îùäå ìà îäøùéîä
-----ôåð÷öéä ùáåã÷ú îä äîçéø äî÷ñéîìé ùì äúøåôåú áùéîåù áVIEW åàåîøú àí äúøåôä ùäåëðñä äéà òåìä äëé é÷ø
alter function dbo.who_is_max (@name varchar(50))
returns varchar(30)
as
begin
declare @price int
select @price= m.price from medications m
where m.name=@name
DECLARE @max INT;
SELECT @max =ms.max_price
FROM MedicationStats ms;
declare @result varchar(50)
if @price=@max
select @result= 'äúøåôä äëé é÷øä'
else
select @result= 'éù é÷øåú éåúø'
return @result
end
go
declare @name varchar(50)
select dbo.who_is_max('àðèéáéåèé÷ä')
select m.price from medications m
where m.name='àðèéáéåèé÷ä'
SELECT TOP 1 name, price
FROM medications
ORDER BY price DESC;
-----ñì÷è ùîùúîù áôåð÷öéä
----ðùúîù áôåð÷öéä ùáåã÷ú äàí úøåôä äéà äéà äîçéø äî÷ñéîìé
---åðåñéó àú äñì÷è
select m.name,dbo.who_is_max(m.name) AS price_status from medications m
----VIEW ùîöéâä àú äøåôà ìëì úåø ùì îèåôì
---ùéîåù á JOIN
create view join_doctors_patients
as
select d.first_name,d.last_name,d.snif_id,a.appointments_id,p.first_name as family,p.last_name as name from doctors d
join appointments a on a.doctor_id=d.doctor_id
join patients p on p.patients_id=a.patient_id
select * from join_doctors_patients
----îëàï åäìàä ìôé äøùéîä
----ùéîåù áôåð÷öéä/ôøåöãåøä/VIEW/èøéâø
---ùéîåù áôåð÷öéåú àâøâèéáéåú
CREATE VIEW MedicationStats
AS
SELECT
COUNT(medications_id) AS total_medications,
AVG(price) AS avg_price,
MIN(price) AS min_price,
MAX(price) AS max_price
FROM medications
select * from MedicationStats
----ùéîåù áGROUP BY
---ùéîåù áORDER BY
alter VIEW doctors_snifim
AS
SELECT
doctor_id,
COUNT(DISTINCT snif_id) AS num_of_snifim
FROM doctors
GROUP BY doctor_id;
select doctor_id, num_of_snifim from doctors_snifim
order by num_of_snifim desc
--- îùäå ùìà äéä ëúåá áãó---áøéøú îçãì òáåø äúøåôä ùäîèåôì ÷éáì
ALTER TABLE Appointments
ADD CONSTRAINT DF_Medication_Default
DEFAULT N'ìà éãåò' FOR medication_id;
DELETE FROM appointments
WHERE appointments_id= 13;
-----îçé÷ú ðúåðé èáìä
truncate table rooms
----ùéîåù áàåðéåï
select d.first_name,d.last_name,'øåôà' as status from doctors d
union
select m.first_name,m.last_name,m.job_title from more_employees m
---éöéøú èøéâø ùáëì äåñôä éåñéó ìèáìú ìåâ àú äðúåðéí
create table log(
appointments_id int,
doctor_id int,
patient_id int,
appointment_time datetime,
medication_id int
)
create trigger tr_insert_log
on appointments
for insert
as
INSERT INTO log (appointments_id, doctor_id, patient_id, appointment_time, medication_id)
SELECT a.appointments_id, a.doctor_id, a.patient_id, a.appointment_time, a.medication_id
FROM inserted a;
go
select * from log
----ùéîåù áUPDATE åáJOIN
---ðòãëï àú èáìú äçãøéí ðùðä àú äøåôàéí ùòåáãéí áëì çãø
----åðñúîê òì èáìú äøåôàéí ìøàåú ùéù äúàîä
UPDATE r
SET r.doctor_id = d.doctor_id
FROM rooms r
JOIN doctors d
ON r.doctor_id = d.doctor_id
WHERE r.floor_number = 3;
select * from rooms
----ùéîåù áWHILE
----ðéöåø ôåð÷öéä ùú÷áì ùí øåôà
-----åúáãå÷ ìôé ëîåú äùòåú ùäåà òåáã áéåí
-----ëîä úåøéí äåà éëåì ìäëðéñ áéåí
alter function dbo.how_many_tores (@name varchar(50),@lastname varchar(50))
returns int
as
begin
declare @result int=0
declare @amount_of_hours int
set @amount_of_hours=( select d.amount_of_hours from doctors d
where d.first_name=@name and d.last_name=@lastname)
select @amount_of_hours=@amount_of_hours*60
----ðâéã ùäæîï ääîåöò ùì úåø äåà 20 ã÷åú
while (@amount_of_hours>=20)
begin
set @amount_of_hours=@amount_of_hours-20
set @result=@result+1
end
return @result
end
go
select dbo.how_many_tores('âáøéàì','áø÷')as amount_of_tores
-----ñì÷è áúåê ñì÷è
----ìà äéä ìé øòéåï àéê ìùìá àú æä áôåð÷öéä
----åäáðúé ùäîåøä àîøä ùàí ìà îåöàéí àôùø áìé
----äùàéìúà ùåìôú àú äøåôà ùéù àìéå äëé äøáä úåøéí
select a.doctor_id,d.first_name,d.last_name,count(a.appointments_id)as amount_of_tores from appointments a
join doctors d on d.doctor_id=a.doctor_id
group by a.doctor_id,d.first_name,d.last_name
having count(a.appointments_id)=
(select top 1 count(a.appointments_id) from appointments a
group by doctor_id
)
----ùìåùú ñåâé äñ÷ìè äîáå÷ùéí
----left join
select a.patient_id,p.first_name,p.last_name,m.name
from appointments a
join patients p on p.patients_id=a.patient_id
left join medications m on m.medications_id=a.medication_id
----left join where null
select a.patient_id,p.first_name,p.last_name,m.name
from appointments a
join patients p on p.patients_id=a.patient_id
left join medications m on m.medications_id=a.medication_id
where m.name is null
----left join and
select a.patient_id,p.first_name,p.last_name,m.name
from appointments a
join patients p on p.patients_id=a.patient_id
left join medications m on m.medications_id=a.medication_id and m.name like 'à%'
-----ùéîåù áCROSS APPLY
select * from appointments a
cross apply(
select *from medications m
where m.medications_id=a.medication_id
)m
----outer apply
select * from appointments a
outer apply(
select *from medications m
where m.medications_id=a.medication_id
)m
-----------------sql dynamic
---ùìéôä ùùåìôú àú ëì äùãåú ááú àçú
---ëì èáìä áðôøã
select 'select'+' ' +STRING_AGG(c.name,',')+' '+'from '+t.name from sys.tables t
join sys.columns c on t.object_id=c.object_id
group by t.name
select appointment_time,appointments_id,doctor_id,medication_id,patient_id from appointments
select amount_of_hours,doctor_id,first_name,last_name,phone,snif_id,specialty,working_hours from doctors
select appointment_time,appointments_id,doctor_id,medication_id,patient_id from log
select create_date,expiration_date,help_for,medications_id,name,price from medications
select employees_id,first_name,job_title,last_name,phone,working_hours from more_employees
select first_name,last_name,patients_id,tz from patients
select doctor_id,floor_number,rooms_id from rooms
select building_number,city,snifim_id,street from snifim