mirror of
https://github.com/ada-dmitry/DB.mephi_ada.git
synced 2026-09-23 23:50:16 +00:00
reboot rep
This commit is contained in:
@@ -13,36 +13,36 @@
|
||||
-- действительное число. Заполните таблицы people и people_log
|
||||
-- несколькими записями (не менее 5 на таблицу).
|
||||
|
||||
CREATE TABLE people (
|
||||
id SERIAL PRIMARY KEY,
|
||||
first_name VARCHAR(50),
|
||||
last_name VARCHAR(50),
|
||||
birthday DATE,
|
||||
amount DECIMAL(10, 2)
|
||||
);
|
||||
CREATE TABLE people (
|
||||
id SERIAL PRIMARY KEY,
|
||||
first_name VARCHAR(50),
|
||||
last_name VARCHAR(50),
|
||||
birthday DATE,
|
||||
amount DECIMAL(10, 2)
|
||||
);
|
||||
|
||||
CREATE TABLE people_log (
|
||||
id SERIAL PRIMARY KEY,
|
||||
person_id INTEGER REFERENCES people(id),
|
||||
operation_date TIMESTAMP,
|
||||
sum DECIMAL(10, 2)
|
||||
);
|
||||
CREATE TABLE people_log (
|
||||
id SERIAL PRIMARY KEY,
|
||||
person_id INTEGER REFERENCES people(id),
|
||||
operation_date TIMESTAMP,
|
||||
sum DECIMAL(10, 2)
|
||||
);
|
||||
|
||||
INSERT INTO people (first_name, last_name, birthday, amount)
|
||||
VALUES
|
||||
('Иван', 'Иванов', '1985-05-15', 1000.50),
|
||||
('Петр', 'Петров', '1990-10-20', 750.25),
|
||||
('Мария', 'Сидорова', '1978-12-03', 3000.75),
|
||||
('Елена', 'Козлова', '1989-08-27', 200.00),
|
||||
('Алексей', 'Смирнов', '1980-04-18', 1500.00);
|
||||
INSERT INTO people (first_name, last_name, birthday, amount)
|
||||
VALUES
|
||||
('Иван', 'Иванов', '1985-05-15', 1000.50),
|
||||
('Петр', 'Петров', '1990-10-20', 750.25),
|
||||
('Мария', 'Сидорова', '1978-12-03', 3000.75),
|
||||
('Елена', 'Козлова', '1989-08-27', 200.00),
|
||||
('Алексей', 'Смирнов', '1980-04-18', 1500.00);
|
||||
|
||||
INSERT INTO people_log (person_id, operation_date, sum)
|
||||
VALUES
|
||||
(1, '2023-09-20 10:15:00', 250.00),
|
||||
(3, '2023-10-01 15:30:00', 800.50),
|
||||
(2, '2023-11-05 08:45:00', 100.25),
|
||||
(4, '2023-11-25 12:00:00', 50.00),
|
||||
(5, '2023-12-02 18:20:00', 300.00);
|
||||
INSERT INTO people_log (person_id, operation_date, sum)
|
||||
VALUES
|
||||
(1, '2023-09-20 10:15:00', 250.00),
|
||||
(3, '2023-10-01 15:30:00', 800.50),
|
||||
(2, '2023-11-05 08:45:00', 100.25),
|
||||
(4, '2023-11-25 12:00:00', 50.00),
|
||||
(5, '2023-12-02 18:20:00', 300.00);
|
||||
|
||||
SELECT * FROM people;
|
||||
SELECT * FROM people_log;
|
||||
@@ -56,49 +56,47 @@ SELECT * FROM people_log;
|
||||
-- операций с отрицательной суммой и данные об общем числе операций
|
||||
-- и среднем значении суммы.
|
||||
|
||||
CREATE OR REPLACE PROCEDURE statement_of_acount(start_date DATE, end_date DATE) AS $$
|
||||
CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
|
||||
DECLARE
|
||||
pos_sum RECORD;
|
||||
neg_sum RECORD;
|
||||
total_count INTEGER;
|
||||
avg_amount NUMERIC;
|
||||
const CONSTANT INTEGER = 3;
|
||||
|
||||
pos_counter INTEGER := 0;
|
||||
neg_counter INTEGER := 0;
|
||||
total_sum NUMERIC := 0;
|
||||
total_count INTEGER := 0;
|
||||
const CONSTANT INTEGER := 3;
|
||||
avg_amount NUMERIC := 0;
|
||||
operation RECORD;
|
||||
BEGIN
|
||||
FOR pos_sum IN (
|
||||
FOR operation IN (
|
||||
SELECT operation_date, sum
|
||||
FROM people_log
|
||||
WHERE operation_date BETWEEN start_date AND end_date AND sum > 0
|
||||
ORDER BY sum DESC
|
||||
LIMIT const
|
||||
WHERE operation_date BETWEEN start_date AND end_date
|
||||
ORDER BY sum
|
||||
) LOOP
|
||||
RAISE INFO 'Positive: %, Sum: %', pos_sum.operation_date, pos_sum.sum;
|
||||
IF operation.sum > 0 THEN
|
||||
pos_counter := pos_counter + 1;
|
||||
IF pos_counter <= const THEN
|
||||
RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
|
||||
END IF;
|
||||
ELSE
|
||||
neg_counter := neg_counter + 1;
|
||||
IF neg_counter <= const THEN
|
||||
RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
total_sum := total_sum + operation.sum;
|
||||
total_count := total_count + 1;
|
||||
END LOOP;
|
||||
|
||||
FOR neg_sum IN (
|
||||
SELECT operation_date, sum
|
||||
FROM people_log
|
||||
WHERE operation_date BETWEEN start_date AND end_date AND sum < 0
|
||||
ORDER BY sum ASC
|
||||
LIMIT const
|
||||
) LOOP
|
||||
RAISE INFO 'Negative: %, Sum: %', neg_sum.operation_date, neg_sum.sum;
|
||||
END LOOP;
|
||||
|
||||
SELECT COUNT(*) INTO total_count
|
||||
FROM people_log
|
||||
WHERE operation_date BETWEEN start_date AND end_date;
|
||||
|
||||
SELECT AVG(sum) INTO avg_amount
|
||||
FROM people_log
|
||||
WHERE operation_date BETWEEN start_date AND end_date;
|
||||
IF total_count > 0 THEN
|
||||
avg_amount := total_sum / total_count;
|
||||
END IF;
|
||||
|
||||
RAISE INFO 'Total number of operations: %', total_count;
|
||||
RAISE INFO 'Average amount of transactions: %', avg_amount;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
END $$ LANGUAGE plpgsql;
|
||||
|
||||
CALL statement_of_acount('2023-01-01', '2023-12-31');
|
||||
|
||||
|
||||
-- Задание 3
|
||||
@@ -115,14 +113,62 @@ CALL statement_of_acount('2023-01-01', '2023-12-31');
|
||||
|
||||
CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$
|
||||
DECLARE
|
||||
m integer;
|
||||
BEGIN
|
||||
select into m count(operation_date) from people_log where to_char(operation_date,'DD')= to_char(now(),'DD');
|
||||
if m>=3 then
|
||||
|
||||
UPDATE people
|
||||
SET amount = amount + add_sum
|
||||
WHERE id = new_id;
|
||||
INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), add_sum);
|
||||
ELSE
|
||||
raise info 'Too many operations'
|
||||
END $$ LANGUAGE plpgsql;
|
||||
|
||||
CALL account_operation(5, 1000000);
|
||||
|
||||
SELECT * FROM people;
|
||||
SELECT * FROM people_log;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
|
||||
DECLARE
|
||||
pos_counter INTEGER := 0;
|
||||
neg_counter INTEGER := 0;
|
||||
total_sum NUMERIC := 0;
|
||||
total_count INTEGER := 0;
|
||||
const CONSTANT INTEGER := 3;
|
||||
avg_amount NUMERIC := 0;
|
||||
operation RECORD;
|
||||
BEGIN
|
||||
FOR operation IN (
|
||||
SELECT operation_date, sum
|
||||
FROM people_log
|
||||
WHERE operation_date BETWEEN start_date AND end_date
|
||||
ORDER BY sum
|
||||
) LOOP
|
||||
IF operation.sum > 0 THEN
|
||||
pos_counter := pos_counter + 1;
|
||||
IF pos_counter <= const THEN
|
||||
RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
|
||||
END IF;
|
||||
ELSE
|
||||
neg_counter := neg_counter + 1;
|
||||
IF neg_counter <= const THEN
|
||||
RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
total_sum := total_sum + operation.sum;
|
||||
total_count := total_count + 1;
|
||||
END LOOP;
|
||||
|
||||
IF total_count > 0 THEN
|
||||
avg_amount := total_sum / total_count;
|
||||
END IF;
|
||||
|
||||
RAISE INFO 'Total number of operations: %', total_count;
|
||||
RAISE INFO 'Average amount of transactions: %', avg_amount;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
@@ -0,0 +1,47 @@
|
||||
DROP TABLE IF EXISTS bd6_departments;
|
||||
DROP TABLE IF EXISTS bd6_employees;
|
||||
|
||||
|
||||
CREATE TABLE bd6_departments(
|
||||
id integer PRIMARY KEY,
|
||||
name varchar(64),
|
||||
postal_code varchar(6),
|
||||
street varchar(64),
|
||||
building varchar(16),
|
||||
city varchar(32)
|
||||
);
|
||||
|
||||
INSERT INTO bd6_departments
|
||||
VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
||||
(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
||||
(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
||||
(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
||||
(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
||||
(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
||||
|
||||
CREATE TABLE bd6_employees(
|
||||
id integer PRIMARY KEY,
|
||||
last_name varchar(64) NOT NULL,
|
||||
first_name varchar(64) NOT NULL,
|
||||
phone_number varchar(18),
|
||||
email varchar(32),
|
||||
department_id integer NOT NULL,
|
||||
manager_id integer,
|
||||
salary_in_euro numeric(8, 2) DEFAULT 0 NOT NULL,
|
||||
UNIQUE(last_name, first_name, department_id)
|
||||
);
|
||||
|
||||
|
||||
INSERT INTO bd6_employees VALUES(1, 'Radygin', 'Victor', '8-(495)-567-7788', 'vr@e.mail.mephi.ru', 10, NULL, 8000),
|
||||
(2, 'Kuprijanov', 'Dmitrij', '8-(495)-567-7794', 'kd@e.mail.mephi.ru', 60, 1, 6534.33),
|
||||
(3, 'Ivanov-Skladovskij', 'Ivan', '8-(495)-567-7799', 'ii1@mail.mephi.ru', 20, 1, 4404.14),
|
||||
(4, 'Petrov', 'Petr', '8-(495)-567-7794', 'petrovpetr@m.gmail.ru', 60, 2, 3456.43),
|
||||
(5, 'kozlov', 'Konstantin', '8-(495)-567-7794', 'kkozlov@mephi.ru', 60, 2, 2300),
|
||||
(6, 'Abramov', 'Abram', '8-(495)-567-7794', 'abramova@k75.mephi.ru', 60, 2, 2200.11),
|
||||
(7, 'IvanovпїЅ-SkladovskпїЅya-Petrova', 'Ivanka', '8-(495)-567-7794', 'ii2@mail.mephi.ru', 60, 4, 3756.33),
|
||||
(8, 'Petrov', 'Ivan', '8-(495)-567-7799', 'petrovivan@m.gmail.ru', 20, 3, 4850),
|
||||
(9, 'kozlov', 'Ivan', '8-(495)-567-7799', 'ikozlov@mephi.ru', 20, 3, 3460),
|
||||
(10, 'Abramov', 'Moisej', '8-(495)-567-7794', 'abramovm@k75.mephi.ru', 60, 4, 2345),
|
||||
(11, 'Petrov', 'Alex', '8-(495)-567-7799', 'petroval@m.gmail.ru', 20, 3, 2465),
|
||||
(12, 'kozlov', 'Maxim', '8-(495)-567-7799', 'mkozlov@mephi.ru', 20, 3, 2788),
|
||||
(13, 'Abramov', 'Isyaslav', '8-(495)-567-7738', 'abramovi@k75.mephi.ru', 30, 1, 6500);
|
||||
@@ -1,13 +1,13 @@
|
||||
DROP TABLE IF EXISTS bd6_employees;
|
||||
|
||||
-- CREATE TABLE bd6_departments(
|
||||
-- id integer PRIMARY KEY,
|
||||
-- name varchar(64),
|
||||
-- postal_code varchar(6),
|
||||
-- street varchar(64),
|
||||
-- building varchar(16),
|
||||
-- city varchar(32)
|
||||
-- );
|
||||
CREATE TABLE bd6_departments(
|
||||
id integer PRIMARY KEY,
|
||||
name varchar(64),
|
||||
postal_code varchar(6),
|
||||
street varchar(64),
|
||||
building varchar(16),
|
||||
city varchar(32)
|
||||
);
|
||||
CREATE TABLE
|
||||
bd6_employees (
|
||||
id integer PRIMARY KEY,
|
||||
@@ -21,13 +21,13 @@ CREATE TABLE
|
||||
UNIQUE (last_name, first_name, department_id)
|
||||
);
|
||||
|
||||
-- INSERT INTO bd6_departments
|
||||
-- VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
||||
-- (20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
||||
-- (30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
||||
-- (40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
||||
-- (50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
||||
-- (60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
||||
INSERT INTO bd6_departments
|
||||
VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
||||
(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
||||
(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
||||
(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
||||
(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
||||
(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
||||
INSERT INTO
|
||||
bd6_employees
|
||||
VALUES
|
||||
@@ -189,6 +189,33 @@ call f();
|
||||
|
||||
-- Task 7 from lab4 --
|
||||
|
||||
|
||||
CREATE table staff(
|
||||
id integer primary key,
|
||||
name varchar(64) NOT NULL,
|
||||
department varchar(64) NOT NULL
|
||||
);
|
||||
|
||||
CREATE SEQUENCE staff_id_seq
|
||||
START WITH 12
|
||||
CYCLE
|
||||
INCREMENT BY 8
|
||||
CACHE 100;
|
||||
|
||||
|
||||
INSERT INTO staff VALUES
|
||||
(nextval('staff_id_seq'), 'Ivan Makarenko', 'Director');
|
||||
|
||||
INSERT INTO staff
|
||||
(SELECT nextval('staff_id_seq'), last_name, department_name
|
||||
FROM employees e JOIN departments d ON e.department_id = d.department_id);
|
||||
|
||||
UPDATE staff SET department = 'Innovations department'
|
||||
WHERE id < 40;
|
||||
|
||||
DELETE FROM staff
|
||||
WHERE name ILIKE('%K%');
|
||||
|
||||
CREATE VIEW dep_staff_counts AS
|
||||
SELECT department, COUNT(*) AS ecount
|
||||
FROM staff
|
||||
@@ -200,42 +227,224 @@ SELECT * FROM dep_staff_counts;
|
||||
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE department_names(integer) AS $$
|
||||
-- CREATE OR REPLACE PROCEDURE department_names(integer) AS $$
|
||||
-- DECLARE
|
||||
-- d_attrs RECORD;
|
||||
-- i INTEGER;
|
||||
-- l INTEGER;
|
||||
-- BEGIN
|
||||
-- FOR d_attrs IN
|
||||
-- (
|
||||
-- SELECT id,last_name, first_name, manager_id
|
||||
-- FROM bd6_employees order by manager_id
|
||||
-- )
|
||||
-- LOOP
|
||||
-- IF d_attrs.manager_id=$1 THEN
|
||||
-- RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||
-- l:= d_attrs.id;
|
||||
-- CALL department_names(l);
|
||||
-- END IF;
|
||||
-- END LOOP;
|
||||
-- END $$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
-- CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$
|
||||
-- DECLARE d_attrs RECORD;
|
||||
-- BEGIN
|
||||
-- FOR d_attrs IN
|
||||
-- (
|
||||
-- SELECT id,last_name, first_name, manager_id
|
||||
-- FROM bd6_employees
|
||||
-- order by manager_id
|
||||
-- )
|
||||
|
||||
-- LOOP
|
||||
-- if d_attrs.id=$1 then
|
||||
-- RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||
-- end if;
|
||||
-- END LOOP;
|
||||
-- CALL department_names($1);
|
||||
-- END $$ LANGUAGE plpgsql;
|
||||
-- CALL department_names2(4);
|
||||
|
||||
|
||||
/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
|
||||
|
||||
|
||||
-- Task 1 --
|
||||
-- Пункт а)
|
||||
WITH RECURSIVE tmp AS (
|
||||
|
||||
SELECT id, first_name, last_name, manager_id, 1 AS level
|
||||
FROM bd6_employees
|
||||
WHERE 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
|
||||
;
|
||||
|
||||
-- Пункт б)
|
||||
CREATE OR REPLACE PROCEDURE depa(integer) AS $$
|
||||
DECLARE
|
||||
d_attrs RECORD;
|
||||
i INTEGER;
|
||||
l INTEGER;
|
||||
i integer;
|
||||
l integer;
|
||||
BEGIN
|
||||
FOR d_attrs IN
|
||||
(
|
||||
SELECT id,last_name, first_name, manager_id
|
||||
FROM bd6_employees order by manager_id
|
||||
FROM bd6_employees
|
||||
ORDER BY manager_id
|
||||
)
|
||||
LOOP
|
||||
IF d_attrs.manager_id=$1 THEN
|
||||
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||
l:= d_attrs.id;
|
||||
CALL department_names(l);
|
||||
IF d_attrs.manager_id=$1 THEN
|
||||
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||
l:= d_attrs.id;
|
||||
CALL depa(l);
|
||||
END IF;
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
END $$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$
|
||||
DECLARE d_attrs RECORD;
|
||||
BEGIN
|
||||
CREATE OR REPLACE PROCEDURE dep(integer) AS $$
|
||||
DECLARE
|
||||
d_attrs RECORD;
|
||||
BEGIN
|
||||
FOR d_attrs IN
|
||||
(
|
||||
SELECT id,last_name, first_name, manager_id
|
||||
SELECT
|
||||
id,
|
||||
last_name,
|
||||
first_name,
|
||||
manager_id
|
||||
FROM bd6_employees
|
||||
order by manager_id
|
||||
ORDER BY manager_id
|
||||
)
|
||||
|
||||
LOOP
|
||||
if d_attrs.id=$1 then
|
||||
LOOP
|
||||
IF d_attrs.id=$1 THEN
|
||||
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||
end if;
|
||||
END IF;
|
||||
END LOOP;
|
||||
CALL department_names($1);
|
||||
CALL depa($1);
|
||||
END $$ LANGUAGE plpgsql;
|
||||
CALL department_names2(4);
|
||||
CALL dep(1);
|
||||
|
||||
-- Task 2 --
|
||||
|
||||
UPDATE bd6_employees SET salary_in_euro = 299 WHERE id = 3;
|
||||
|
||||
CREATE OR REPLACE PROCEDURE print_employees() AS $$
|
||||
DECLARE
|
||||
current_salary INTEGER;
|
||||
m_salary INTEGER;
|
||||
mod_salary INTEGER := 0;
|
||||
employee_rec RECORD;
|
||||
i INTEGER = 0;
|
||||
cnt INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO cnt FROM bd6_employees;
|
||||
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 cnt - 1 = i THEN
|
||||
m_salary := ((current_salary) / 100) * 100 + mod_salary;
|
||||
ELSE
|
||||
m_salary := ((current_salary) / 100) * 100;
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
|
||||
|
||||
mod_salary := mod_salary + mod(current_salary, 100);
|
||||
i := i+1;
|
||||
|
||||
END LOOP;
|
||||
|
||||
END $$ LANGUAGE plpgsql;
|
||||
|
||||
CALL print_employees();
|
||||
SELECT *
|
||||
FROM bd6_employees
|
||||
ORDER BY salary_in_euro;
|
||||
|
||||
|
||||
-- Task 3 --
|
||||
CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
|
||||
DECLARE
|
||||
salaries RECORD;
|
||||
small NUMERIC[];
|
||||
larg NUMERIC[];
|
||||
const CONSTANT INTEGER = 10;
|
||||
BEGIN
|
||||
FOR salaries IN
|
||||
SELECT id, salary_in_euro
|
||||
FROM bd6_employees
|
||||
ORDER BY salary_in_euro
|
||||
LIMIT const
|
||||
LOOP
|
||||
small = array_append(small, (SELECT salary_in_euro FROM bd6_employees WHERE id = salaries.id));
|
||||
UPDATE bd6_employees SET manager_id = NULL WHERE manager_id = salaries.id;
|
||||
DELETE FROM bd6_employees
|
||||
WHERE id = salaries.id;
|
||||
END LOOP;
|
||||
|
||||
FOR salaries IN
|
||||
SELECT id, salary_in_euro
|
||||
FROM bd6_employees
|
||||
ORDER BY salary_in_euro DESC
|
||||
LIMIT const
|
||||
LOOP
|
||||
larg = array_append(larg, (SELECT id FROM bd6_employees WHERE id = salaries.id));
|
||||
END LOOP;
|
||||
|
||||
FOR i IN 1..const
|
||||
LOOP
|
||||
UPDATE bd6_employees
|
||||
SET salary_in_euro = salary_in_euro + small[i]
|
||||
WHERE id = larg[i];
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
SELECT rearrange_salaries();
|
||||
|
||||
-- Task 4 --
|
||||
|
||||
CREATE OR REPLACE PROCEDURE f() AS $$
|
||||
DECLARE d_attrs RECORD;
|
||||
BEGIN
|
||||
|
||||
FOR d_attrs IN WITH RECURSIVE tmp AS (
|
||||
SELECT 1+i*5 AS f1, 2+i*5 AS f2, 3+i*5 AS f3, 4+i*5 AS f4,5+i*5 AS f5
|
||||
FROM generate_series(0,199) i)
|
||||
|
||||
SELECT * FROM tmp
|
||||
LOOP
|
||||
case
|
||||
when ( mod(d_attrs.f1,2)!=0)
|
||||
then RAISE INFO ' % % % % %', d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5;
|
||||
when ( mod(d_attrs.f1,2)=0)
|
||||
then RAISE INFO ' % % % % %', d_attrs.f5, d_attrs.f4, d_attrs.f3, d_attrs.f2, d_attrs.f1;
|
||||
end case;
|
||||
END LOOP;
|
||||
END $$ LANGUAGE plpgsql;
|
||||
call f();
|
||||
|
||||
-- Task 7 from lab4 --
|
||||
DROP VIEW IF EXISTS dep_staff_counts;
|
||||
|
||||
CREATE VIEW dep_staff_counts AS
|
||||
SELECT department, COUNT(*) AS ecount
|
||||
FROM staff
|
||||
GROUP BY department;
|
||||
|
||||
SELECT * FROM dep_staff_counts;
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
--2
|
||||
SELECT *
|
||||
FROM bd_departments
|
||||
WHERE LENGTH(street) = POWER(SQRT(75 + LENGTH(street)), 2) / 4;
|
||||
|
||||
INSERT INTO bd_departments VALUES
|
||||
(35,'meow', 407596, 'aaaaaaaaaaaaaaaaaaaaaaaaa', 2, 'MSK');
|
||||
--4
|
||||
CREATE TABLE employees_backup AS
|
||||
SELECT *,
|
||||
CASE
|
||||
WHEN random() < 0.5 THEN 'Active'
|
||||
ELSE 'Inactive'
|
||||
END AS employee_status
|
||||
FROM bd_employees;
|
||||
SELECT * FROM employees_backup;
|
||||
--5
|
||||
SELECT e.employee_id, e.first_name, e.last_name, e.manager_id
|
||||
FROM employees e
|
||||
JOIN employees m ON e.manager_id = m.employee_id
|
||||
WHERE LENGTH(m.last_name) > 6;
|
||||
|
||||
--3--
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RAISE NOTICE 'Шахматная доска:';
|
||||
CALL chess('z9', 'C');
|
||||
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||
CALL chess('a5', ' A ');
|
||||
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||
CALL chess('h4', ' Y ');
|
||||
|
||||
|
||||
END $$;
|
||||
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE chess(pos varchar, bukva char) AS $$
|
||||
DECLARE
|
||||
board text;
|
||||
queen_col integer;
|
||||
queen_row integer;
|
||||
BEGIN
|
||||
queen_col := ascii(substring(pos from 1 for 1)) - 96;
|
||||
queen_row := substring(pos from 2)::integer;
|
||||
|
||||
FOR i IN 1..8 LOOP
|
||||
board := '';
|
||||
|
||||
FOR j IN 1..8 LOOP
|
||||
IF i = queen_row AND j = queen_col THEN
|
||||
board := board || bukva;
|
||||
ELSE
|
||||
IF (i + j) % 2 = 0 THEN
|
||||
board := board || ' б ';
|
||||
ELSE
|
||||
board := board || ' ч ';
|
||||
END IF;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '%', board;
|
||||
END LOOP;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
SELECT chess('c3');
|
||||
@@ -0,0 +1,32 @@
|
||||
DO $$
|
||||
DECLARE
|
||||
board CHAR(8)[][] := ARRAY[
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б']
|
||||
];
|
||||
|
||||
BEGIN
|
||||
RAISE NOTICE 'Шахматная доска:';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||
board[8 - 5 + 1][ASCII('A') - 64] := 'A';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||
board[8 - ч + 1][ASCII('H') - 64] := 'У';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
END $$;
|
||||
Reference in New Issue
Block a user