From be9bce2ce15b0e0dd86a0d5a7aabb4441c951807 Mon Sep 17 00:00:00 2001 From: Dmitry <124861781+ada-dmitry@users.noreply.github.com> Date: Sun, 12 Nov 2023 18:04:13 +0300 Subject: [PATCH 1/3] Update lab5.sql --- Lab/Lab#5/lab5.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lab/Lab#5/lab5.sql b/Lab/Lab#5/lab5.sql index 5bf2073..c7af218 100644 --- a/Lab/Lab#5/lab5.sql +++ b/Lab/Lab#5/lab5.sql @@ -30,7 +30,7 @@ WHERE LENGTH(REGEXP_REPLACE(first_name, '[^aeiouAEIOU]', '', 'g')) <= 3; WITH tmp AS ( SELECT chr(i+96), i FROM generate_series(1,26) i) -SELECT e.last_name sum(t.i) AS name_sum -FROM db_employees e +SELECT e.last_name, sum(t.i) AS name_sum +FROM bd_employees e JOIN tmp t ON t.chr = ANY(string_to_array(LOWER(e.last_name), NULL)) -GROUP BY e.last_name; \ No newline at end of file +GROUP BY e.last_name; From 406cf427bce4740d1146e8a39d033b6581430ad8 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sun, 26 Nov 2023 20:49:18 +0300 Subject: [PATCH 2/3] added 6lab --- Lab/Lab#6/lab6.sql | 74 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Lab/Lab#6/lab6.sql diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql new file mode 100644 index 0000000..e4900c8 --- /dev/null +++ b/Lab/Lab#6/lab6.sql @@ -0,0 +1,74 @@ +/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */ + + +-- Task 1 -- +/* a) Напишите запрос, используя конструкцию WITH, выбирающий +рекурсивно сотрудника с идентификатором 1 и все его подчинённых, +как прямых, так и подчинённых более низкого ранга*. +b) Напишите программу на языке PL/SQL, печатающую на экран фамилию +и имя сотрудника с идентификатором 1 и всех его подчинённых, как +прямых, так и подчинённых более низкого ранга. */ + +CREATE OR REPLACE PROCEDURE department_names() AS $$ +DECLARE d_attrs RECORD; +BEGIN + +FOR d_attrs IN WITH RECURSIVE tmp AS ( + SELECT id, first_name, last_name, manager_id, 1 AS level + FROM bd6_employees + WHERE manager_id = 1 or id = 1 + UNION ALL + SELECT e.id, e.first_name, e.last_name, e.manager_id, t.level + 1 + FROM bd6_employees e JOIN tmp t ON e.manager_id = t.id ) + +SELECT * FROM tmp +LOOP + RAISE INFO ' % % ', d_attrs.first_name, d_attrs.last_name; +END LOOP; +END $$ LANGUAGE plpgsql; +CALL department_names(); + + +-- Task 2 -- +/* Напишите программу на языке PL/SQL, выбирающую строки из таблицы +employees в порядке возрастания заработной платы (salary) и печатающие на +экран следующие данные: фамилия, имя, модифицированная заработная +плата. Модифицированная заработная плата получается следующим +образом: у первого по порядку сотрудника она округляется до сотен в +меньшую сторону, а у всех последующих сотрудников она сначала +увеличивается на остаток от округления, полученный от предыдущего +сотрудника, а затем округляется до сотен в меньшую сторону. */ + +-- Task 3 -- +/* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с +самой маленькой заработной платой. При этом их заработная плата должна +добавиться 10 сотрудникам с самой большой заработной платой. Причём +самая маленькая заработная плата должна добавиться к человеку с самой +большой заработной платой. 2-я с конца заработная плата должна добавиться +к человеку со второй по размеру заработной платой и т.д. */ + +-- Task 4 -- +/* Создайте таблицу spiral с 5 полями f1, f2, f3, f4, f5 – целые числа. +Напишите программу на языке PL/SQL, заполняющую данную таблицу 1000 +строк по следующему принципу: +1 2 3 4 5 +10 9 8 7 6 +11 12 13 14 15 +20 19 18 17 16 +21 22 23 24 25 */ + +CREATE OR REPLACE PROCEDURE f() AS $$ +DECLARE d_attrs RECORD; +BEGIN + +FOR d_attrs IN WITH RECURSIVE tmp AS ( + SELECT i AS f1, i2 AS f2, i3 AS f3,i4 AS f4,i5 AS f5 + FROM generate_series(1,200) i) + +SELECT * FROM tmp +LOOP +RAISE INFO ' % % % % %', +d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5; +END LOOP; +END $$ LANGUAGE plpgsql; +call f(); From cb30b4bb8450f6ff820ccd3803b739b75680c20a Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sun, 26 Nov 2023 22:08:08 +0300 Subject: [PATCH 3/3] added t2 lab6 --- Lab/Lab#6/lab6.sql | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql index e4900c8..4f7e5b7 100644 --- a/Lab/Lab#6/lab6.sql +++ b/Lab/Lab#6/lab6.sql @@ -9,7 +9,7 @@ b) Напишите программу на языке PL/SQL, печатающ и имя сотрудника с идентификатором 1 и всех его подчинённых, как прямых, так и подчинённых более низкого ранга. */ -CREATE OR REPLACE PROCEDURE department_names() AS $$ +CREATE OR REPLACE PROCEDURE department_names() AS DECLARE d_attrs RECORD; BEGIN @@ -25,7 +25,7 @@ SELECT * FROM tmp LOOP RAISE INFO ' % % ', d_attrs.first_name, d_attrs.last_name; END LOOP; -END $$ LANGUAGE plpgsql; +END LANGUAGE plpgsql; CALL department_names(); @@ -39,6 +39,29 @@ employees в порядке возрастания заработной плат увеличивается на остаток от округления, полученный от предыдущего сотрудника, а затем округляется до сотен в меньшую сторону. */ +CREATE OR REPLACE FUNCTION print_employees() RETURNS VOID AS $$ +DECLARE +current_salary INTEGER; +m_salary INTEGER; +mod_salary INTEGER := 0; +employee_rec RECORD; +BEGIN +FOR employee_rec IN (SELECT last_name, first_name, salary_in_euro FROM bd6_employees ORDER BY salary_in_euro) LOOP +current_salary := employee_rec.salary_in_euro; + +IF mod_salary=0 THEN +m_salary := (current_salary / 100) * 100; + ELSE +m_salary := ((current_salary + mod_salary) / 100) * 100; +END IF; + +RAISE NOTICE 'Employee: % %, Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary; +mod_salary := current_salary - m_salary; +END LOOP; +END $$ LANGUAGE plpgsql; + +SELECT print_employees(); + -- Task 3 -- /* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с самой маленькой заработной платой. При этом их заработная плата должна