Будем считать наличие трех пятерок
Будем считать наличие трех пятерок по сессии признаком повышенной стипендии, + 50% к основной, наличие двух пятерок из сданных экзаменов и, отсутствие двоек и троек на сданных экзаменах — признаком повышения стипендии на 25%, наличие хотя бы одной двойки среди сданных экзаменов — признаком снятия или отсутствия стипендии вообще, то есть -100% надбавки. При отсутствии троек на сданных экзаменах назначим обычную стипендию с надбавкой 0%. Однако все эти изменения мы должны будем сделать отдельными операциями обновления.
Назначение повышенной стипендии:
UPDATE R5
SET R5.Стипендия = 50% WHERE R5.ФИО IN
(SELECT Rl.ФИО
FROM Rl
WHERE Rl.Оценка =5
GROOP BY Rl.ФИО
HAVING COUNT(*) =3 )
Назначение стипендии с надбавкой 25%:
UPDATE R5 SET R5.Стипендия = 25%
WHERE R5.ФИО IN (SELECT Rl.ФИО FROM R1
WHERE Rl.ФИО NOT IN (SELECT А.ФИО FROM Rl A
WHERE А.Оценка <=3 OR А.Оценка IS NULL)
GROOP BY Rl.ФИО HAVING COUNT(*)>2 )
Назначение обычной стипендии:
UPDATE R5
SET R5.Стипендия = 0% WHERE R5.ФИО IN (SELECT Rl.ФИО FROM Rl
WHERE Rl.Оценка >=4 AND Р1.ФИО NOT IN (SELECT А.ФИО FROM Rl A
WHERE А.Оценка <= 3 OR А.Оценка IS NULL) )
Снятие стипендии:
UPDATE R5
SET R5.Стипендия =-100% WHERE R5.ФИО IN
(SELECT Rl.ФИО
FROM Rl
WHERE Rl.Оценка <= 2 OR Rl.Оценка IS NULL)
Почему мы в первом запросе на обновление не использовали дополнительную проверку на отсутствие двоек, троек и несданных экзаменов, как мы сделали это при назначении следующих видов стипендии? Просто мы учли особенности нашей предметной области: у нас в соответствии с исходными данными не только 3 экзамена. Но если мы можем предположить, что число экзаменов может быть произвольным и изменяться от семестра к семестру, то нам надо изменить наш запрос. Запрос — это некоторый алгоритм решения конкретной задачи, которую мы формулируем заранее на естественном языке. И оттого, что наша задача решается всего одним оператором языка SQL, она не становится примитивной. Мощность языка SQL и состоит в том, что он позволяет одним предложением сформулировать ответы на достаточно сложные запросы, для реализации которых на традиционных языках понадобилось бы писать большую программу.