[4sem] add db course files

This commit is contained in:
Andrew Nuark G 2021-05-11 22:08:11 +07:00
parent ea29f4148d
commit 827b74f0b4
13 changed files with 1087 additions and 0 deletions

39
4sem/db/lab10.sql Normal file
View file

@ -0,0 +1,39 @@
BEGIN TRANSACTION
DECLARE @firstSpecialityID INT = (SELECT TOP 1 ID
FROM [Специальность]
ORDER BY ID);
-- Создайте группу студентов, обучающихся по специальности, на которую студентов
-- не набирали.
INSERT INTO [Группа]([Название], [КодСпециальности], [ЗачётнаяКнижкаСтаросты], [ТабельныйНомерКуратора])
VALUES (N'КИ20-09Б', @firstSpecialityID + 1, NULL, 1);
-- Одну из групп, которых две по одной специальности (см. требования Лаб. раб. №9),
-- перевести в созданную группу (на другую специальность).
-- КИ20-07Б -> КИ20-09Б
DECLARE @firstGroupID INT = (SELECT TOP 1 ID
FROM [Группа]
ORDER BY ID);
DECLARE @newGroupID INT = (SELECT ID
FROM [Группа]
WHERE [Название] = N'КИ20-09Б');
UPDATE [Студент]
SET Группа = @newGroupID
FROM [Студент]
WHERE Группа = @firstGroupID;
-- Назначьте старосту и куратора тех же людей, которые были в теперь уже пустой
-- группе.
UPDATE [Группа]
SET ЗачётнаяКнижкаСтаросты = (SELECT [ЗачётнаяКнижкаСтаросты] FROM [Группа] WHERE ID = @firstGroupID),
ТабельныйНомерКуратора = (SELECT [ТабельныйНомерКуратора] FROM [Группа] WHERE ID = @firstGroupID)
FROM [Группа]
WHERE ID = @newGroupID;
-- Удалите пустую группу из таблицы.
DELETE
FROM Группа
WHERE ID = @firstGroupID;
COMMIT TRANSACTION

21
4sem/db/lab11.sql Normal file
View file

@ -0,0 +1,21 @@
DROP FUNCTION IF EXISTS dbo.AverageMark;
DROP FUNCTION IF EXISTS dbo.CreditsList;
GO;
CREATE FUNCTION dbo.AverageMark(@disciplineId int) RETURNS float AS BEGIN;
DECLARE @out float = (SELECT AVG(CAST(Оценка AS FLOAT)) FROM Изучение WHERE Дисциплина = @disciplineId);
RETURN IIF(@out < 2, ROUND(@out, 0), @out);
END;
GO;
CREATE FUNCTION dbo.CreditsList(@groupId int, @semester int) RETURNS table AS RETURN (
SELECT DISTINCT D.[Название], D.[Отчётность] FROM [Дисциплина] AS D
JOIN [Группа] as G on G.ID = @groupId
WHERE D.[Семестр] = @semester AND G.[КодСпециальности] = D.[КодСпециальности]
);
GO;
SELECT dbo.AverageMark(4), dbo.AverageMark(12), dbo.AverageMark(2);
SELECT * FROM dbo.CreditsList(2, 2);
SELECT * FROM dbo.CreditsList(4,1);

17
4sem/db/lab12.sql Normal file
View file

@ -0,0 +1,17 @@
DROP VIEW IF EXISTS dbo.ExcellentStudents;
GO;
CREATE VIEW dbo.ExcellentStudents AS
SELECT SSQ.[Фамилия], SSQ.[Имя], SSQ.[Отчество], SSQ.[Группа], SSQ.[Семестр]
FROM (SELECT S.[Фамилия], S.[Имя], S.[Отчество], S.[Группа], D.[Семестр], AVG(L.[Оценка]) AS AVG_MARK
FROM [Изучение] AS L
JOIN [Дисциплина] AS D on L.[Дисциплина] = D.ID
JOIN [Студент] AS S on L.[Студент] = S.[НомерЗачетнойКнижки]
GROUP BY S.[Фамилия], S.[Имя], S.[Отчество], S.[Группа], D.[Семестр]) AS SSQ
WHERE SSQ.AVG_MARK = 5
OR SSQ.AVG_MARK = 1
GROUP BY SSQ.[Фамилия], SSQ.[Имя], SSQ.[Отчество], SSQ.[Группа], SSQ.[Семестр];
GO;
SELECT *
FROM dbo.ExcellentStudents;

56
4sem/db/lab13.sql Normal file
View file

@ -0,0 +1,56 @@
DROP TRIGGER IF EXISTS dbo.NoDeleteUsedDiscipline;
DROP TRIGGER IF EXISTS dbo.NoSetWrongCaptain;
DROP TRIGGER IF EXISTS dbo.NoInsertWrongExam;
GO;
CREATE TRIGGER dbo.NoDeleteUsedDiscipline ON [Дисциплина] INSTEAD OF DELETE AS BEGIN
SET NOCOUNT ON;
DECLARE @d_discID TABLE (DISC INT);
INSERT INTO @d_discID(DISC) SELECT ID FROM DELETED;
IF EXISTS(SELECT * FROM [Изучение] AS L WHERE EXISTS(SELECT * FROM @d_discID WHERE DISC = L.[Дисциплина])) BEGIN
RAISERROR ('Deletion is not allowed: discipline is in use', 16, 1);
RETURN;
END;
DELETE FROM [Дисциплина] WHERE EXISTS(SELECT * FROM @d_discID WHERE DISC = ID);
END;
GO;
CREATE TRIGGER dbo.NoSetWrongCaptain ON [Группа] AFTER UPDATE AS BEGIN
SET NOCOUNT ON;
DECLARE @c_groupID TABLE (GRP INT, NCPT INT);
INSERT INTO @c_groupID(GRP, NCPT) SELECT ID, INSERTED.[ЗачётнаяКнижкаСтаросты] FROM INSERTED;
IF UPDATE([ЗачётнаяКнижкаСтаросты]) AND EXISTS(SELECT * FROM [Студент] AS S WHERE EXISTS(SELECT * FROM @c_groupID WHERE GRP = S.[Группа] AND S.[НомерЗачетнойКнижки] = NCPT))
RETURN;
RAISERROR ('New captain not from this group', 16, 1);
END;
GO;
CREATE TRIGGER dbo.NoInsertWrongExam ON [Изучение] AFTER INSERT AS BEGIN
SET NOCOUNT ON;
DECLARE @i_learnID TABLE (SID INT, DID INT);
INSERT INTO @i_learnID(SID, DID) SELECT INSERTED.Студент, INSERTED.Дисциплина FROM INSERTED;
IF EXISTS(SELECT * FROM [Студент] AS S
JOIN [Группа] AS G on S.[Группа] = G.ID
RIGHT JOIN [Дисциплина] AS D on D.[КодСпециальности] = G.[КодСпециальности]
WHERE EXISTS(SELECT * FROM @i_learnID WHERE SID = S.[НомерЗачетнойКнижки] AND D.ID = DID))
RETURN;
RAISERROR ('Student is not learning that discipline', 16, 1);
END;
GO;
BEGIN TRANSACTION
DELETE FROM [Дисциплина] WHERE ID = 33;
UPDATE [Группа] SET [Группа].[ЗачётнаяКнижкаСтаросты] = 25 WHERE ID = 4;
INSERT INTO [Изучение]([Студент], [Дисциплина], [Дата], [Оценка]) VALUES (13, 9, '2020-09-05', 1);
ROLLBACK TRANSACTION

136
4sem/db/lab2.sql Normal file
View file

@ -0,0 +1,136 @@
drop table if exists [Сделка];
drop table if exists [Склад];
drop table if exists [Сотрудник];
drop table if exists [Поставщик];
drop table if exists [Клиент];
drop table if exists [Товар];
go
CREATE TABLE [Сотрудник]
(
ID int IDENTITY (1,1),
Имя nvarchar(300) NOT NULL,
КодНачальника int NOT NULL,
CONSTRAINT [PK_СОТРУДНИК] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TABLE [Поставщик]
(
ID int IDENTITY (1,1),
Имя nvarchar(300) NOT NULL,
CONSTRAINT [PK_ПОСТАВЩИК] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TABLE [Клиент]
(
ID int IDENTITY (1,1),
Имя nvarchar(300) NOT NULL,
Телефон nvarchar(10) NOT NULL,
Адрес nvarchar(300) NOT NULL,
Пол bit NOT NULL,
CONSTRAINT [PK_КЛИЕНТ] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TABLE [Товар]
(
ID int IDENTITY (1,1),
Имя nvarchar(300) NOT NULL,
Количество int NOT NULL,
Описание nvarchar(300) NOT NULL,
Категория nvarchar(300) NOT NULL,
CONSTRAINT [PK_ТОВАР] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TABLE [Склад]
(
ID int IDENTITY (1,1),
КодПоставщика int NOT NULL,
КодТовара int NOT NULL,
Количество int NOT NULL,
Цена money NOT NULL,
Дата date NOT NULL,
CONSTRAINT [PK_СКЛАД] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TABLE [Сделка]
(
ID int IDENTITY (1,1),
Дата date NOT NULL,
КодСклада int NOT NULL,
КодКлиента int NOT NULL,
КодСотрудника int NOT NULL,
Количество int NOT NULL,
Скидка money NOT NULL,
CONSTRAINT [PK_СДЕЛКА] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (IGNORE_DUP_KEY = OFF)
)
GO
ALTER TABLE [Сотрудник]
WITH CHECK ADD CONSTRAINT [Сотрудник_fk0] FOREIGN KEY ([КодНачальника]) REFERENCES [Сотрудник] ([ID])
ON UPDATE NO ACTION
GO
ALTER TABLE [Сотрудник]
CHECK CONSTRAINT [Сотрудник_fk0]
GO
ALTER TABLE [Склад]
WITH CHECK ADD CONSTRAINT [Склад_fk0] FOREIGN KEY ([КодПоставщика]) REFERENCES [Поставщик] ([ID])
ON UPDATE CASCADE
GO
ALTER TABLE [Склад]
CHECK CONSTRAINT [Склад_fk0]
GO
ALTER TABLE [Склад]
WITH CHECK ADD CONSTRAINT [Склад_fk1] FOREIGN KEY ([КодТовара]) REFERENCES [Товар] ([ID])
ON UPDATE CASCADE
GO
ALTER TABLE [Склад]
CHECK CONSTRAINT [Склад_fk1]
GO
ALTER TABLE [Сделка]
WITH CHECK ADD CONSTRAINT [Сделка_fk0] FOREIGN KEY ([КодСклада]) REFERENCES [Склад] ([ID])
ON UPDATE CASCADE
GO
ALTER TABLE [Сделка]
CHECK CONSTRAINT [Сделка_fk0]
GO
ALTER TABLE [Сделка]
WITH CHECK ADD CONSTRAINT [Сделка_fk1] FOREIGN KEY ([КодКлиента]) REFERENCES [Клиент] ([ID])
ON UPDATE CASCADE
GO
ALTER TABLE [Сделка]
CHECK CONSTRAINT [Сделка_fk1]
GO
ALTER TABLE [Сделка]
WITH CHECK ADD CONSTRAINT [Сделка_fk2] FOREIGN KEY ([КодСотрудника]) REFERENCES [Сотрудник] ([ID])
ON UPDATE CASCADE
GO
ALTER TABLE [Сделка]
CHECK CONSTRAINT [Сделка_fk2]
GO

271
4sem/db/lab3.sql Normal file
View file

@ -0,0 +1,271 @@
BEGIN TRANSACTION
------------------------------------------------------------------------------------------------------------------------
-- Очистим базу
DELETE FROM [Сделка] WHERE 1 > 0;
DELETE FROM [Клиент] WHERE 1 > 0;
DELETE FROM [Склад] WHERE 1 > 0;
DELETE FROM [Поставщик] WHERE 1 > 0;
DELETE FROM [Сотрудник] WHERE 1 > 0;
DELETE FROM [Товар] WHERE 1 > 0;
-- Обновим ключи
DBCC CHECKIDENT ([Сделка], RESEED, 1);
DBCC CHECKIDENT ([Клиент], RESEED, 1);
DBCC CHECKIDENT ([Склад], RESEED, 1);
DBCC CHECKIDENT ([Поставщик], RESEED, 1);
DBCC CHECKIDENT ([Сотрудник], RESEED, 1);
DBCC CHECKIDENT ([Товар], RESEED, 1);
go
------------------------------------------------------------------------------------------------------------------------
-- Генерируем клиентов
INSERT INTO [Клиент]([Имя], [Телефон], [Адрес], [Пол])
VALUES (N'Агафонова Милана Фёдоровна', '3361876906', N'985019, Свердловская область, город Талдом, шоссе Бухарестская, 82', '0'),
(N'Давыдова Александра Александровна', '9114695687', N'264202, Ярославская область, город Воскресенск, шоссе Космонавтов, 60', '0'),
(N'Демина Мария Александровна', '9461046614', N'266856, Самарская область, город Шаховская, проезд Домодедовская, 00', '0'),
(N'Иванов Иван Александрович', '9968051776', N'581486, Тюменская область, город Наро-Фоминск, пр. Будапештсткая, 49', '1'),
(N'Никифоров Руслан Александрович', '8331275435', N'624218, Новгородская область, город Озёры, въезд Домодедовская, 45', '1'),
(N'Руднев Олег Владимирович', '9004552583', N'157285, Оренбургская область, город Мытищи, пл. 1905 года, 52', '1'),
(N'Самсонов Георгий Кириллович', '9817892552', N'157598, Амурская область, город Талдом, наб. Домодедовская, 71', '1'),
(N'Семенова Екатерина Марковна', '9479462287', N'303011, Астраханская область, город Воскресенск, наб. Гоголя, 43', '0'),
(N'Тимофеев Михаил Михайлович', '9514816307', N'303937, Белгородская область, город Воскресенск, наб. Ленина, 46', '1'),
(N'Фролова Елена Игоревна', '9807420852', N'364746, Иркутская область, город Кашира, пер. Чехова, 27', '0');
------------------------------------------------------------------------------------------------------------------------
-- Генерируем поставщиков
INSERT INTO [Поставщик]([Имя])
VALUES (N'Андреева София Константиновна'),
(N'Булгаков Егор Тихонович'),
(N'Жукова Виктория Матвеевна'),
(N'Иванова София Владиславовна'),
(N'Левина Яна Александровна'),
(N'Максимов Макар Богданович'),
(N'Назаров Савелий Степанович'),
(N'Полякова Мария Михайловна'),
(N'Соколов Илья Дмитриевич'),
(N'Фомин Михаил Сергеевич');
------------------------------------------------------------------------------------------------------------------------
-- Генерируем сотрудников
-- Создадим менеджера
INSERT INTO [Сотрудник]([Имя]) VALUES (N'Баженова Д.');
DECLARE @manager INT;
set @manager = (SELECT TOP 1 [ID] FROM [Сотрудник] WHERE [КодНачальника] IS NULL);
-- Начальников отделов
INSERT INTO [Сотрудник]([КодНачальника], [Имя])
VALUES (@manager, N'Демина Д.'),
(@manager, N'Иванов З.');
DECLARE @depHead1 INT;
DECLARE @depHead2 INT;
set @depHead1 = (SELECT TOP 1 [ID] FROM [Сотрудник] WHERE [КодНачальника] IS NOT NULL);
set @depHead2 = @depHead1 + 1
-- И их подчинённых
INSERT INTO [Сотрудник]([КодНачальника], [Имя])
VALUES (@depHead1, N'Иванова А.'),
(@depHead1, N'Иванова П.'),
(@depHead1, N'Марков Д.'),
(@depHead2, N'Наумов И.'),
(@depHead2, N'Попов И.'),
(@depHead2, N'Смирнов И.');
------------------------------------------------------------------------------------------------------------------------
-- Генерируем товары
INSERT INTO [Товар]([Имя], [Количество], [Категория], [Описание])
VALUES (N'Золотая мотыга', 1, N'Инструмент', N'Лучшая на рынке мотыга, самая быстрая и прочная'),
(N'Перфоратор "Сосед"', 1, N'Иснтрумент', N'Перфорирует всё и вся'),
(N'Смектит диоктаэдрический', 10, N'Лекарство', N'Порошок для приготовления суспензии для приёма внутрь'),
(N'Ретто', 1, N'Лекарство', N'Таблетки против изжоги'),
(N'Панкреатин', 1, N'Лекарство', N'Комплекс ферментов поджелудочной железы'),
(N'Хлорпромазин', 1, N'Лекарство', N'Лекарственное средство, обладающее транквилизирующим, ' +
N'противосудорожным, снотворным, миорелаксантным и ' +
N'седативным действием'),
(N'Сосиски "Столичные"', 20, N'Продукт', N'Мясные сосиски'),
(N'Сарсапарилла', 1, N'Продукт', N'Корневое пиво, сливочный карамельно-мятный вкус'),
(N'Масло Сливочное', 1, N'Продукт', N'Сливочное масло от местного изготовителя'),
(N'Подсолнечное масло', 1, N'Продукт', N'Растительное масло, получаемое из семян масличных сортов ' +
N'подсолнечника масличного');
------------------------------------------------------------------------------------------------------------------------
-- Закинем товары на склады
DECLARE @ignoreGoodStart INT;
DECLARE @ignoreProviderStart INT;
SET @ignoreGoodStart = (SELECT TOP 1 ID
FROM [Товар]
ORDER BY NEWID()) - 2;
SET @ignoreProviderStart = (SELECT TOP 1 ID
FROM [Поставщик]
ORDER BY NEWID()) - 2;
INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата])
SELECT *,
ABS(CHECKSUM(NEWID())) % 10 + 1 as AMOUNT,
ROUND(ABS(CHECKSUM(NEWID())) % 5000 + 1000, -2) as PRICE,
DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 364), '2019-01-01') as DATE
FROM (SELECT [Поставщик].ID as PID, [Товар].ID as GID
FROM [Поставщик]
JOIN [Товар] ON ([Товар].ID NOT BETWEEN @ignoreGoodStart AND @ignoreGoodStart + 3) AND
([Поставщик].ID NOT BETWEEN @ignoreProviderStart AND @ignoreProviderStart + 3)) as SQGP
ORDER BY DATE
DECLARE @lastDay DATE;
SET @lastDay = (SELECT TOP 1 [Дата]
FROM [Склад]
ORDER BY [Дата] DESC);
-- Закинем ещё товаров, сдвинутых по дате, отличных по цене
INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата])
SELECT TOP 5 [КодПоставщика],
[КодТовара],
[Количество],
ROUND([Цена] + (CHECKSUM(NEWID()) % 4000), -2),
DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 30), @lastDay) as DATE
FROM Склад
ORDER BY NEWID();
SET @lastDay = (SELECT TOP 1 [Дата]
FROM [Склад]
ORDER BY [Дата] DESC);
-- Закинем ещё товаров, которые отсутствуют
INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата])
SELECT TOP 5 [КодПоставщика],
[КодТовара],
0,
[Цена],
DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 30), @lastDay) as DATE
FROM Склад
ORDER BY NEWID();
------------------------------------------------------------------------------------------------------------------------
-- Проводим сделки
DECLARE @ignoreStoreStart INT;
DECLARE @lastManagerId INT;
SET @ignoreStoreStart = (SELECT TOP 1 ID
FROM [Склад]
ORDER BY NEWID()) - 2;
set @lastManagerId = (SELECT TOP 1 [КодНачальника]
FROM [Сотрудник]
ORDER BY [КодНачальника] DESC);
INSERT INTO [Сделка]([Дата], [КодСклада], [КодКлиента], [КодСотрудника], [Количество], [Скидка])
SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 20), SDATE) as DATE,
SID,
CID,
(SELECT TOP 1 [Сотрудник].ID
FROM [Сотрудник]
WHERE [Сотрудник].ID = @lastManagerId + 1 + (ABS(CHECKSUM(NEWID())) % 6)
ORDER BY NEWID()) as WID,
ABS(CHECKSUM(NEWID())) % 10 as AMOUNT,
ROUND(ABS(CHECKSUM(NEWID())) % 5000 + 1000, -2) as DISCOUNT
FROM (SELECT [Клиент].ID as CID, [Склад].ID as SID, [Склад].[Дата] as SDATE
FROM [Клиент]
JOIN [Склад] ON ([Склад].ID NOT BETWEEN @ignoreStoreStart AND @ignoreStoreStart + 10)) as SQGP
ORDER BY DATE
------------------------------------------------------------------------------------------------------------------------
COMMIT TRANSACTION
-- Сколько товаров
DECLARE @goodsCount INT;
SET @goodsCount = (SELECT count(ID)
FROM [Товар]);
SELECT @goodsCount as GOODS_COUNT;
-- Сколько товаров нет на складе
DECLARE @goodsInStorage INT;
SET @goodsInStorage = (SELECT count(*)
FROM (SELECT DISTINCT [Склад].[КодТовара]
FROM [Склад]
JOIN [Товар] ON [Товар].ID = [Склад].[КодТовара]) as GIDONS);
SELECT @goodsCount - @goodsInStorage as GOODS_NOT_ON_STORAGE;
-- Сколько есть поставщиков
DECLARE @providersCount INT;
SET @providersCount = (SELECT count(ID)
FROM [Поставщик]);
SELECT @providersCount as PROVIDERS_COUNT;
-- Сколько поставщиков не поставляют товары
DECLARE @providersProvideCount INT;
SET @providersProvideCount = (
SELECT count(*)
FROM (
SELECT DISTINCT [Склад].[КодПоставщика]
from [Склад]
JOIN [Поставщик] ON [Поставщик].ID = [Склад].[КодПоставщика]
) as PIDPG
)
SELECT @providersCount - @providersProvideCount as PROVIDERS_DONT_PROVIDE_COUNT;
-- Менеджер и кол-во менеджеров
DECLARE @managerId INT;
SET @managerId = (SELECT ID FROM [Сотрудник] WHERE [КодНачальника] IS NULL);
SELECT N'Начальник', * FROM [Сотрудник] WHERE ID = @managerId;
-- Главы отделов и кол-во подчинённых
DECLARE @depHead1_ INT;
DECLARE @depHead2_ INT;
SET @depHead1_ = (SELECT TOP 1 ID FROM [Сотрудник] WHERE [КодНачальника] = @managerId);
SET @depHead2_ = @depHead1_ + 1;
SELECT N'Глава отдела', * FROM [Сотрудник] WHERE [КодНачальника] = @managerId;
-- Сотрудники отделов
SELECT N'Глава отдела', * FROM [Сотрудник] WHERE [КодНачальника] BETWEEN @depHead1_ AND @depHead2_;
-- Кол-во записей на складе
SELECT count(ID) FROM [Склад];
-- Один товар поставлен разными поставщиками по разной цене.
DECLARE @randGood INT;
SET @randGood = (SELECT TOP 1 [Склад].[КодТовара] FROM [Склад] ORDER BY NEWID());
SELECT DISTINCT * FROM [Склад] WHERE [КодТовара] = @randGood;
-- Один товар одного поставщика в разные даты поставлялся по разным ценам.
DECLARE @randProvider INT;
SET @randProvider = (SELECT TOP 1 [Склад].[КодПоставщика] FROM [Склад] ORDER BY NEWID());
SET @randGood = (SELECT TOP 1 [Склад].[КодТовара] FROM [Склад] WHERE [КодПоставщика] = @randProvider ORDER BY NEWID());
SELECT * FROM [Склад] WHERE [КодПоставщика] = @randProvider AND [КодТовара] = @randGood;
-- Некоторые товары закончились на складе.
SELECT * FROM [Склад] WHERE [Количество] = 0;
-- Кол-во клиентов, а так же мужчин и женщин среди них
DECLARE @clients INT;
DECLARE @maleClients INT;
DECLARE @femaleClients INT;
SET @clients = (SELECT count(ID)
FROM [Клиент]);
SET @maleClients = (SELECT count(ID)
FROM [Клиент]
WHERE [Пол] = 1);
SET @femaleClients = @clients - @maleClients;
SELECT @clients as CLIENTS, @maleClients as MALES, @femaleClients AS FEMALES;
-- Все клиенты совершили покупку единожды
DECLARE @doneDeal INT;
SET @doneDeal = (SELECT count(*)
FROM (SELECT DISTINCT [Сделка].[КодКлиента]
FROM [Сделка]) as CIDDD);
SELECT @clients as CLIENT, @doneDeal as DONE_DEAL_AT_LEAST_ONCE;
-- Не все товары, имеющиеся на складе, продавались
DECLARE @storagesAmount INT;
SET @storagesAmount = (SELECT count(ID) FROM [Склад]);
SELECT @storagesAmount as STORAGES_AMOUNT, count(*) as UNIQUE_STORAGES_IN_DEALS FROM (SELECT [КодСклада] FROM [Сделка] INTERSECT SELECT ID FROM [Склад]) as SIDWD;

22
4sem/db/lab4.sql Normal file
View file

@ -0,0 +1,22 @@
SELECT
-- Вывести количество сделок, зафиксированных в БД.
(SELECT count(*) FROM [Сделка]) AS DEALS_COUNT,
-- Определить среднее арифметическое значение количества товаров на складе.
(SELECT AVG([Склад].Количество) FROM [Склад]) AS AVERAGE_GOODS_COUNT,
-- Определить общее количество товаров на складе.
(SELECT SUM([Склад].Количество) FROM [Склад]) AS ALL_GOODS_COUNT,
-- Определить максимальное количество товаров на складе.
(SELECT MAX([Склад].Количество) FROM [Склад]) AS MAX_GOODS_COUNT,
-- Вывести значение косинуса для угла 60º.
COS(RADIANS(60.0)) AS COS60,
-- Получить целое случайное число в диапазоне [-7; 2].
-- [-7; 3) -> [-7; 2]
FLOOR(RAND() * (3 - (-7)) + -7) AS RAND_IN_m7_TO_p2,
-- Определить (вывести в виде числа от 1 до 7) текущий день недели.
DAY(GETDATE()) AS CURRENT_DAY;

29
4sem/db/lab5.sql Normal file
View file

@ -0,0 +1,29 @@
-- Сортировать поставщиков в алфавитном (обратном) порядке.
SELECT * FROM [Поставщик] ORDER BY [Имя] DESC;
-- Вывести поставщика(ов) с самым длинным названием.
SELECT TOP 2 * FROM [Поставщик] ORDER BY LEN([Имя]) DESC;
-- Вывести всех покупателей с фамилией, начинающейся на букву «В».
SELECT * FROM [Клиент] WHERE [Клиент].[Имя] LIKE N'И%';
-- Вывести всех покупателей с фамилией, начинающейся с букв в диапазоне от "В" до
-- "К", где вторая буква «о».
-- АБ[ВГДЕЁЖЗИК]ЛМНОПРСТУФХЦЧШЩЭЮЯ
SELECT * FROM [Клиент] WHERE [Клиент].[Имя] LIKE N'[ВГДЕЁЖЗИК]е%';
-- Определите количество сделок за текущий календарный месяц.
SELECT count(*) FROM [Сделка] WHERE MONTH(Дата) = MONTH(GETDATE());
-- Определите количество сделок, зафиксированных в заданные дни недели
-- (например, по вторникам и средам).
DECLARE @MON INT = 1;
DECLARE @TUE INT = 2;
DECLARE @WED INT = 3;
DECLARE @THU INT = 4;
DECLARE @FRI INT = 5;
DECLARE @SAT INT = 6;
DECLARE @SUN INT = 7;
DECLARE @daysList TABLE (ID INT);
INSERT @daysList(ID) VALUES (@MON),(@TUE);
SELECT count(*) FROM [Сделка] WHERE DATEPART(DW, [Дата]) in (SELECT ID FROM @daysList);

55
4sem/db/lab6.sql Normal file
View file

@ -0,0 +1,55 @@
-- Вывести наименования товаров, количество которых на складе максимально (на
-- складе должно быть как минимум два товара, количество которых одинаково и
-- равно максимальному).
SELECT DISTINCT (SELECT TOP 1 [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].КодТовара) as NAME
FROM [Склад]
WHERE [Склад].[Количество] = (SELECT MAX([Склад].[Количество]) FROM [Склад]);
-- Вывести в порядке, обратном алфавитному, наименования товаров, количество
-- которых на складе находится в заданном диапазоне.
DECLARE @goodsAmountFrom INT = 3;
DECLARE @goodsAmountTo INT = 7;
SELECT DISTINCT (SELECT TOP 1 [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].КодТовара) as NAME
FROM [Склад]
WHERE [Склад].[Количество] BETWEEN @goodsAmountFrom AND @goodsAmountTo
ORDER BY NAME DESC;
-- Вывести поставщиков, которые хотя бы раз осуществили поставку, в алфавитном
-- порядке.
SELECT DISTINCT (SELECT TOP 1 [Поставщик].Имя
FROM [Поставщик]
WHERE NOT EXISTS(SELECT * FROM [Склад] WHERE [Склад].КодПоставщика = [Поставщик].ID)) as NAME
FROM [Склад]
ORDER BY NAME;
-- 30 дней с даты последней покупки действует дополнительная скидка на все товары.
-- Вывести список покупателей, имеющих возможность воспользоваться указанной
-- скидкой.
-- YYYY-MM-DD
DECLARE @desiredDate DATE = '2020-04-20';
SELECT DISTINCT (SELECT [Клиент].[Имя] FROM [Клиент] WHERE [Клиент].ID = [Сделка].[КодКлиента]) as NAME
FROM [Сделка]
WHERE DATEDIFF(DAY, [Сделка].[Дата], @desiredDate) <= 30;
-- Вывести список товаров, названия которых начинающиеся с букв «д» и «л»,
-- стоимость которых не более 20% от максимальной.
SELECT (SELECT [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].[КодТовара]) as NAME
FROM [Склад]
WHERE ([Склад].Цена / (SELECT MAX([Склад].[Цена]) FROM [Склад])) <= .8
AND EXISTS(SELECT * FROM [Товар] WHERE [Товар].ID = [Склад].[КодТовара] AND [Товар].[Имя] LIKE N'[мс]%');
-- Вывести поставщиков, которые не поставляют товары, названия которых
-- начинающиеся с букв «д» и «л»
SELECT DISTINCT [Поставщик].[Имя]
FROM [Поставщик]
WHERE NOT EXISTS(SELECT *
FROM [Склад]
WHERE [Склад].[КодПоставщика] = [Поставщик].ID
AND EXISTS(SELECT *
FROM [Товар]
WHERE [Склад].[КодТовара] = [Товар].ID
AND [Товар].[Имя] LIKE N'[мс]%'));
-- Показать список клиентов с указанием их пола («мужчина» или «женщина»).
SELECT [Имя], (IIF([Пол] = 0, N'Женщина', N'Мужчина'))
FROM [Клиент];

34
4sem/db/lab7.sql Normal file
View file

@ -0,0 +1,34 @@
-- Показать какой поставщик поставил каждый товар на склад (INNER JOIN).
SELECT DISTINCT G.[Имя], P.[Имя] FROM [Склад]
INNER JOIN [Поставщик] as P on P.ID = [Склад].[КодПоставщика]
INNER JOIN [Товар] as G on G.ID = [Склад].[КодТовара];
-- Вывести список товаров, которыми торгует фирма, и их поставщиков вне
-- зависимости от наличия поставок (LEFT JOIN).
SELECT [Товар].[Имя], P.[Имя] FROM [Товар]
LEFT JOIN [Склад] as S on S.[КодТовара] = [Товар].ID
LEFT JOIN [Поставщик] as P on P.ID = S.[КодПоставщика];
-- Вывести информацию о покупаемых со склада товарах и их покупателях, включая
-- товары, отсутствующие в списке реализованных товаров (RIGHT JOIN)
SELECT G.[Имя],
IIF(C.[Имя] is NULL, N'Не определён', C.[Имя]),
IIF([Сделка].[Количество] is NULL, N'Не определено', STR([Сделка].[Количество]))
FROM [Сделка]
INNER JOIN [Склад] as S on S.ID = [Сделка].КодСклада
INNER JOIN [Клиент] as C on C.ID = [Сделка].[КодКлиента]
RIGHT JOIN [Товар] as G on G.ID = S.[КодТовара];
-- Вывести список поставщиков, которые хотя бы раз осуществляли поставку на склад
-- (полусоединение).
SELECT DISTINCT [Поставщик].[Имя] FROM [Поставщик]
JOIN [Склад] AS S on [Поставщик].ID = S.[КодПоставщика]
-- Выведите список сотрудников с указанием их прямых начальников
-- (самосоединение). Для главного начальника в столбец «Начальник» вывести
-- «не определен».
SELECT
[Сотрудник].[Имя],
IIF(B.[Имя] is NULL, N'Не определён', B.[Имя])
FROM [Сотрудник]
LEFT JOIN [Сотрудник] as B on B.ID = [Сотрудник].[КодНачальника];

59
4sem/db/lab8-1.sql Normal file
View file

@ -0,0 +1,59 @@
-- Провести оценку количества товара на складе по наименованиям: менее 10 мало,
-- от 10 до 100 достаточно, более 100 избыточно.
SELECT G.[Имя],
SUM([Склад].[Количество]) as AMOUNT,
case
when SUM([Склад].[Количество]) < 10 then N'Мало'
when SUM([Склад].[Количество]) < 101 then N'Достаточно'
else N'Избыточно'
end as ESTIMATION
FROM [Склад]
JOIN [Товар] as G on G.ID = [Склад].[КодТовара]
GROUP BY G.[Имя];
-- Вывести наименования товаров, количество которых на складе от 1 до 10 (35 и 45)
SELECT *
FROM (SELECT G.[Имя],
SUM([Склад].[Количество]) as AMOUNT
FROM [Склад]
JOIN [Товар] as G on G.ID = [Склад].[КодТовара]
GROUP BY G.[Имя]) as SQNG
WHERE AMOUNT BETWEEN 35 AND 45;
-- Определить тройку товаров, выручка за которые самая большая.
SELECT TOP 3 G.[Имя],
SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT
FROM [Склад]
JOIN [Товар] as G on G.ID = [Склад].[КодТовара]
JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID
GROUP BY G.Имя
ORDER BY AMOUNT DESC;
-- Определить суммарную стоимость продаж каждого товара по месяцам.
SELECT G.[Имя],
YEAR(D.[Дата]) as YEAR,
DATENAME(MONTH, D.[Дата]) as MONTH,
SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT
FROM [Склад]
JOIN [Товар] as G on G.ID = [Склад].[КодТовара]
JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID
GROUP BY G.[Имя], YEAR(D.[Дата]), DATENAME(MONTH, D.[Дата])
ORDER BY AMOUNT DESC;
-- Показать месяца, в которых продажи Молока 3,2% (или любого другого товара,
-- хранящегося на складе с разными ID) были ниже 300 денег.
DECLARE @randomGoodsId INT = (SELECT TOP 1 ID
FROM [Товар]
ORDER BY NEWID());
DECLARE @thresholdPrice INT = 200000;
SELECT *
FROM (SELECT G.[Имя],
YEAR(D.[Дата]) as YEAR,
DATENAME(MONTH, D.[Дата]) as MONTH,
SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT
FROM [Склад]
JOIN [Товар] as G on G.ID = [Склад].[КодТовара]
JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID
WHERE [Склад].КодТовара = @randomGoodsId
GROUP BY G.[Имя], YEAR(D.[Дата]), DATENAME(MONTH, D.[Дата])) as SQG
WHERE AMOUNT <= @thresholdPrice;

36
4sem/db/lab8-2.sql Normal file
View file

@ -0,0 +1,36 @@
-- Ранжируйте сотрудников по объемам продаж и выведите тройку лидеров.
WITH trades AS (
SELECT DISTINCT W.[Имя] AS NAME,
SUM([Сделка].[Количество] * S.Цена) OVER (PARTITION BY [КодСотрудника]) AS DEALS_SUM
FROM [Сделка]
JOIN [Склад] AS S ON S.ID = [Сделка].[КодСклада]
JOIN [Сотрудник] AS W ON W.ID = [Сделка].[КодСотрудника]
)
SELECT TOP 3 NAME,
DEALS_SUM,
DENSE_RANK() OVER (ORDER BY DEALS_SUM DESC) AS RANK
FROM trades
ORDER BY DEALS_SUM DESC;
-- Вывести суммы сделок по месяцам для каждого сотрудника и показать разницу с
-- предыдущим месяцем, в котором были зафиксированы сделки
WITH trades AS (
SELECT DISTINCT W.[Имя] AS NAME,
YEAR([Сделка].[Дата]) AS CURR_YEAR,
MONTH([Сделка].[Дата]) AS CURR_MONTH,
SUM([Сделка].[Количество] * S.Цена)
OVER (PARTITION BY [КодСотрудника], YEAR([Сделка].[Дата]), MONTH([Сделка].[Дата])) AS DEALS_SUM_CURR_MONTH
FROM [Сделка]
JOIN [Склад] AS S ON S.ID = [Сделка].[КодСклада]
JOIN [Сотрудник] AS W ON W.ID = [Сделка].[КодСотрудника]
)
SELECT NAME,
CURR_YEAR,
CURR_MONTH,
DEALS_SUM_CURR_MONTH,
DEALS_SUM_CURR_MONTH - COALESCE(LAG(DEALS_SUM_CURR_MONTH) OVER (PARTITION BY NAME ORDER BY NAME), 0.0) AS DIFF_WITH_LAST_MONTH
FROM trades;

312
4sem/db/lab9.sql Normal file
View file

@ -0,0 +1,312 @@
BEGIN TRANSACTION
use dean;
CREATE TABLE [Специальность]
(
ID int IDENTITY (1,1),
Шифр nvarchar(10) NOT NULL,
Наименование nvarchar(100) NOT NULL,
ФормаОбучения nvarchar(20) NOT NULL,
Уровень nvarchar(20) NOT NULL,
ПродолжительностьОбучения int NOT NULL,
Описание nvarchar(4000) NOT NULL,
CONSTRAINT [PK_СПЕЦИАЛЬНОСТЬ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Группа]
(
ID int IDENTITY (1,1),
Название nvarchar(30) NOT NULL,
КодСпециальности int NOT NULL,
ЗачётнаяКнижкаСтаросты int NULL,
ТабельныйНомерКуратора int NOT NULL,
CONSTRAINT [PK_ГРУППА] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Студент]
(
НомерЗачетнойКнижки int IDENTITY (1,1),
Фамилия nvarchar(30) NOT NULL,
Имя nvarchar(30) NOT NULL,
Отчество nvarchar(30) NOT NULL,
Группа int NOT NULL,
ГодПоступления date NOT NULL,
CONSTRAINT [PK_СТУДЕНТ] PRIMARY KEY CLUSTERED (НомерЗачетнойКнижки ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Преподаватель]
(
ТабельныйНомер int IDENTITY (1,1),
Фамилия nvarchar(30) NOT NULL,
Имя nvarchar(30) NOT NULL,
Отчество nvarchar(30) NOT NULL,
УчёнаяСтепень nvarchar(50) NOT NULL,
УчёноеЗвание nvarchar(50) NOT NULL,
Кафедра nvarchar(50) NOT NULL,
CONSTRAINT [PK_ПРЕПОДАВАТЕЛЬ] PRIMARY KEY CLUSTERED (ТабельныйНомер ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Дисциплина]
(
ID int IDENTITY (1,1),
Название nvarchar(100) NOT NULL,
КодСпециальности int NOT NULL,
Семестр int NOT NULL,
Объём int NOT NULL,
Отчётность nvarchar(50) NOT NULL,
CONSTRAINT [PK_ДИСЦИПЛИНА] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Изучение]
(
ID int IDENTITY (1,1),
Студент int NOT NULL,
Дисциплина int NOT NULL,
Дата date NOT NULL,
Оценка int NOT NULL,
CONSTRAINT [PK_ИЗУЧЕНИЕ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
CREATE TABLE [Преподавание]
(
ID int IDENTITY (1,1),
Дисциплина int NOT NULL,
Преподаватель int NOT NULL,
CONSTRAINT [PK_ПРЕПОДАВАНИЕ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF)
);
go;
ALTER TABLE [Группа]
WITH CHECK ADD CONSTRAINT [Группа_fk0] FOREIGN KEY ([КодСпециальности]) REFERENCES [Специальность] ([ID])
ON UPDATE CASCADE;
go;
ALTER TABLE [Группа]
WITH CHECK ADD CONSTRAINT [Группа_fk1] FOREIGN KEY ([ЗачётнаяКнижкаСтаросты]) REFERENCES [Студент] ([НомерЗачетнойКнижки])
ON UPDATE CASCADE;
go;
ALTER TABLE [Группа]
WITH CHECK ADD CONSTRAINT [Группа_fk2] FOREIGN KEY ([ТабельныйНомерКуратора]) REFERENCES [Преподаватель] ([ТабельныйНомер])
ON UPDATE CASCADE;
go;
ALTER TABLE [Студент]
WITH CHECK ADD CONSTRAINT [Студент_fk0] FOREIGN KEY ([Группа]) REFERENCES [Группа] ([ID])
ON UPDATE NO ACTION;
go;
ALTER TABLE [Дисциплина]
WITH CHECK ADD CONSTRAINT [Специальность_fk0] FOREIGN KEY (КодСпециальности) REFERENCES [Специальность] ([ID])
ON UPDATE CASCADE;
go;
ALTER TABLE [Изучение]
WITH CHECK ADD CONSTRAINT [Изучение_fk0] FOREIGN KEY (Студент) REFERENCES [Студент] ([НомерЗачетнойКнижки])
ON UPDATE CASCADE;
go;
ALTER TABLE [Изучение]
WITH CHECK ADD CONSTRAINT [Изучение_fk1] FOREIGN KEY (Дисциплина) REFERENCES [Дисциплина] ([ID])
ON UPDATE CASCADE;
go;
ALTER TABLE [Преподавание]
WITH CHECK ADD CONSTRAINT [Преподавание_fk0] FOREIGN KEY (Дисциплина) REFERENCES [Дисциплина] ([ID])
ON UPDATE CASCADE;
go;
ALTER TABLE [Преподавание]
WITH CHECK ADD CONSTRAINT [Преподавание_fk1] FOREIGN KEY (Преподаватель) REFERENCES [Преподаватель] ([ТабельныйНомер])
ON UPDATE CASCADE;
go;
COMMIT TRANSACTION
BEGIN TRANSACTION
INSERT INTO [Преподаватель]([Фамилия], [Имя], [Отчество], [УчёнаяСтепень], [УчёноеЗвание], [Кафедра])
VALUES (N'Казаков', N'Олег', N'Владимирович', N'Кандидат технических наук', N'Профессор',
N'Информатика и вычислительная техника'),
(N'Селиванов', N'Кирилл', N'Владимирович', N'Отсутствует', N'Старший преподаватель',
N'Информатика и вычислительная техника'),
(N'Оленева', N'Татьяна', N'Сергеевна', N'Отсутствует', N'Старший преподаватель',
N'Информатика и вычислительная техника'),
(N'Хантимиров', N'Илья', N'Андреевич', N'Отсутствует', N'Ассистент', N'Информатика и вычислительная техника');
INSERT INTO [Специальность]([Шифр], [Наименование], [ФормаОбучения], [Уровень], [ПродолжительностьОбучения], [Описание])
VALUES (N'09.03.01', N'Информатика и вычислительная техника', N'Очная', N'Бакалавриат', 4,
N'Для того чтобы стать квалифицированным специалистом в выбранном направлении, студенту предстоит научиться:\n\nопределять сферу исследования, собирать, проводить проверку, обрабатывать и анализировать первичные сведения для проектирования;\nразрабатывать программное обеспечение, используя современные инструментальные приложения и средства;\nанализировать технические данные и научную информацию, делать выводы, опираясь на опыт зарубежных и российских коллег по теме проектирования;\nобучать сотрудников компании, использовать современные методы и автоматизированные программные средства для исследования и проектирования;\nосуществлять техническое обслуживание ЭВМ, программных средств и периферийной аппаратуры;\nустанавливать необходимые программные системы и приложения, настраивать и обеспечивать нормальную работу программно-аппаратных средств;\nанализировать показатели технического состояния, амортизации у вычислительного оборудования;\nпроизводить мероприятия по текущему ремонту и профилактике качественной работы систем;\nналаживать взаимосвязь между элементами и узлами вычислительных приборов;\nмонтировать, проводить тестирования и вводить в эксплуатацию вычислительные и информационные сети;\nработать с программными языками и писать приложения на них.'),
(N'09.03.02', N'Информационные системы и технологии', N'Очная', N'Бакалавриат', 4,
N'Бакалавров, получающих образование в области информационных систем и технологий, учат:\n\nосуществлять комплексный анализ разрабатываемых проектов и проводить консультации, помогающие обеспечить подготовку производственного процесса и технического обслуживания;\nизучать взаимосвязи в информационных комплексах и проводить системный анализ заданной области;\nсоздавать прикладные и базовые технологии;\nпроводить комплекс работ, направленных на освоение и финишную модернизацию технологических процессов на этапе подготовки производственного процесса нового продукта;\nпринимать непосредственное участие в вычислительных тестированиях и экспериментах, направленных на проверку точности и актуальности применяемых математических моделей;\nкорректировать стратегию проекта, исходя из инфраструктурного обеспечения предприятия и действующих в нем информационных систем;\nсобирать конечную программную систему, используя для этого готовые элементы и компоненты;\nобеспечивать непрерывную работу и сопровождать информационные технологии и системы, опираясь на требования по качеству и надежности;\nсоставлять доступные инструкции для персонала по применению правильной техники эксплуатации.'),
(N'09.03.04', N'Программная инженерия', N'Очная', N'Бакалавриат', 4,
N'Изучение данной специальности позволит студентам:\n\nучаствовать в осуществлении научных наблюдений и экспериментов в области глубокого анализа программных проектов, продукции, инструментов и методов изучаемого направления;\nобрабатывать и изучать возможности удовлетворения предъявленных заказчиком к разработчику требованиям;\nконструировать компоненты и составляющие программных изделий в необходимом для проектирования объеме в рамках определенного задания;\nадаптировать и использовать средства автоматизированного испытания, проектирования, разработки и обслуживания продукции;\nосуществлять деятельность, направленную на обучение пользователей и их аттестацию в области эксплуатации компьютерных систем;\nустанавливать, настраивать, осваивать и администрировать программное обеспечение;\nпроводить профилактические и корректирующие работы, связанные с эффективным использованием установленных требованиями продуктов;\nразрабатывать пакет документов и формы отчетности;\nсоздавать новые методические программы и разработки в области повышения квалификации и установления общего базового уровня технического персонала в области эксплуатации систем;\nсоздавать положительный эмоциональный и деловой фон во взаимоотношениях с заказчиком;\nиспользовать стандартные инструменты для обеспечения контроля, оценки и качества необходимого уровня программных продуктов.'),
(N'09.04.01', N'Информатика и вычислительная техника', N'Очная', N'Магистратура', 2,
N'Магистры, получившие дипломы в этой области, умеют:\n\nмоделировать изучаемые процессы и изделия;\nсоздавать новые способы и средства конструирования новых устройств и процессов;\nпродумывать процесс автоматизации принимаемых решений;\nсамостоятельно производить испытания и тестирования, обстоятельно изучать их результаты;\nвыполнять работу ассистента на профильных кафедрах ВУЗов в преподавательской сфере;\nразрабатывать и проводить учебные курсы, которые контролируют доценты и профессоры;\nписать методические пособия, применяемые студентами в процессе учебы;\nпроектировать автоматизированные системы, обоснованно выбирать аппаратно-программные средства информатизации и автоматизации;\nконструировать сложные изделия, к которым относятся также и программные комплексы, применяя средства автоматизации и передовой опыт;\nосуществлять проекты, направленные на создание программ, комплексов и информационных баз;\nсоздавать проекты по объединению информационных систем, опираясь на методики и типовые стандарты в области документооборота и логистической поддержки;\nанализировать продуктивность конструируемых систем, выполняя технико-экономический и функционально-стоимостной анализ;\nсоздавать документы, определяющие нормы и технические стандарты для разработанных программ и проектов.'),
(N'09.04.02', N'Информационные системы и технологии', N'Очная', N'Магистратура', 2,
N'Магистры информационных технологий и систем с легкостью справляются со следующими профессиональными обязанностями:\n\nопределяют основную проектную стратегию, обозначают цели, необходимые для достижений в области проектирования, выбирают основные показатели эффективности и продуктивности, а также ограничивают сферу применения информационных технологий и систем;\nразрабатывают персональные задания для исполнителей в области конструирования отдельных составляющих и элементов, используя при этом методологию системной инженерии;\nприводят к общему виду и классифицируют по типам принимаемые решения;\nорганизовывают конструктивную работу в сфере взаимодействия коллективов заказчика и производителя;\nосуществляют поиск компромиссных решений в долгосрочной и краткосрочной перспективе, находят наилучшие варианты;\nизучают и создают собственные объектные модели в сфере машино- и приборостроения, науки, образования и техники;\nиспользуют определенную методику и способы для выполнения моделирования объектов и процессов;\nпредсказывают направления и темпы развития в сфере информационных технологий и систем;\nобеспечивают методическое наполнение учебного процесса в различных образовательных учреждениях;\nразрабатывают новые идеи, способные составить высокую конкуренцию тем, что действуют на рынке.'),
(N'09.04.04', N'Программная инженерия', N'Очная', N'Магистратура', 2,
N'Для получения степени магистра по программной инженерии учащемуся предстоит научиться:\n\nсоздавать новые средства, способы и методы, необходимые для осуществления процесса изучения объектов программной инженерии, опираясь на унифицированные тенденции в сфере развития профессиональной области;\nразрабатывать программы и проекты, направленные на удовлетворение требований, а также осуществлять контрольные и управляющие функции;\nиспользовать системный подход, моделирование и структурный анализ для выполнения проектных задач;\nприменять новейшие технологии в области конструирования программных комплексов и систем, используя средства автоматизации в процессах планирования, управления и контроля над качеством проектируемой продукции;\nпланировать и координировать работу в процессе разработки программных приложений;\nвыступать в роли эксперта по обучению пользователей необходимым навыкам для использования продукта;\nпроводить анализ и делать выводы на основе полученных сведений, создавая технико-экономическую базу для обоснования принятых решений;\nделать выбор в пользу экономической или технической модели развития и сопровождать на всех этапах жизненного цикла программный продукт;\nоптимизировать принятые проектные и технологические решения, обеспечивая необходимые условия для поддержания высокого уровня качества объектов.');
DECLARE @firstTeacherID INT = (SELECT TOP 1 ID
FROM [Специальность]
ORDER BY ID);
DECLARE @firstSpecialityID INT = (SELECT TOP 1 ID
FROM [Специальность]
ORDER BY ID);
INSERT INTO [Группа]([Название], [КодСпециальности], [ЗачётнаяКнижкаСтаросты], [ТабельныйНомерКуратора])
VALUES (N'КИ20-07Б', @firstSpecialityID, NULL, @firstTeacherID),
(N'КИ20-08Б', @firstSpecialityID + 2, NULL, @firstTeacherID + 1),
(N'КИ16-07Б', @firstSpecialityID + 3, NULL, @firstTeacherID + 2),
(N'КИ16-08Б', @firstSpecialityID + 5, NULL, @firstTeacherID + 3);
DECLARE @firstGroupID INT = (SELECT TOP 1 ID
FROM [Группа]
ORDER BY ID);
INSERT INTO [Студент]([Фамилия], [Имя], [Отчество], [Группа], [ГодПоступления])
VALUES (N'Муравьёв', N'Вячеслав', N'Геннадиевич', @firstGroupID, '2020-09-01'),
(N'Сафонов', N'Мстислав', N'Федорович', @firstGroupID, '2020-09-01'),
(N'Воронов', N'Терентий', N'Созонович', @firstGroupID, '2020-09-01'),
(N'Козлова', N'Томила', N'Рудольфовна', @firstGroupID, '2020-09-01'),
(N'Полякова', N'Изольда', N'Леонидовна', @firstGroupID, '2020-09-01'),
(N'Михеева', N'Янина', N'Давидовна', @firstGroupID, '2020-09-01'),
(N'Мухина', N'Милена', N'Ростиславовна', @firstGroupID, '2020-09-01'),
(N'Дьячкова', N'Беатриса', N'Ильяовна', @firstGroupID + 1, '2020-09-01'),
(N'Евсеева', N'Нинна', N'Мэлоровна', @firstGroupID + 1, '2020-09-01'),
(N'Князев', N'Виссарион', N'Ильяович', @firstGroupID + 1, '2020-09-01'),
(N'Панфилов', N'Моисей', N'Михайлович', @firstGroupID + 1, '2020-09-01'),
(N'Вишняков', N'Юлиан', N'Григорьевич', @firstGroupID + 1, '2020-09-01'),
(N'Самсонова', N'Агния', N'Парфеньевна', @firstGroupID + 1, '2020-09-01'),
(N'Ермакова', N'Елена', N'Феликсовна', @firstGroupID + 1, '2020-09-01'),
(N'Мишин', N'Харитон', N'Протасьевич', @firstGroupID + 2, '2016-09-01'),
(N'Калинина', N'Мэри', N'Аристарховна', @firstGroupID + 2, '2016-09-01'),
(N'Петухова', N'Наталия', N'Владленовна', @firstGroupID + 2, '2016-09-01'),
(N'Назаров', N'Исак', N'Егорович', @firstGroupID + 2, '2016-09-01'),
(N'Кузнецов', N'Варлаам', N'Ярославович', @firstGroupID + 2, '2016-09-01'),
(N'Трофимова', N'Ванесса', N'Мироновна', @firstGroupID + 2, '2016-09-01'),
(N'Мухин', N'Родион', N'Авксентьевич', @firstGroupID + 2, '2016-09-01'),
(N'Шарапова', N'Богдана', N'Васильевна', @firstGroupID + 3, '2016-09-01'),
(N'Шарапова', N'Моника', N'Филатовна', @firstGroupID + 3, '2016-09-01'),
(N'Рожков', N'Флор', N'Ростиславович', @firstGroupID + 3, '2016-09-01'),
(N'Красильников', N'Ипполит', N'Романович', @firstGroupID + 3, '2016-09-01'),
(N'Белоусова', N'Бронислава', N'Валерьяновна', @firstGroupID + 3, '2016-09-01'),
(N'Николаев', N'Корней', N'Альбертович', @firstGroupID + 3, '2016-09-01'),
(N'Рыбаков', N'Даниил', N'Тарасович', @firstGroupID + 3, '2016-09-01');
UPDATE [Группа]
SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 1 ORDER BY NEWID())
FROM [Группа]
WHERE ID = 1;
UPDATE [Группа]
SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 2 ORDER BY NEWID())
FROM [Группа]
WHERE ID = 2;
UPDATE [Группа]
SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 3 ORDER BY NEWID())
FROM [Группа]
WHERE ID = 3;
UPDATE [Группа]
SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 4 ORDER BY NEWID())
FROM [Группа]
WHERE ID = 4;
/*
Учились 2 семестра. В каждом было 3 зачета и 2 экзамена по четырем дисциплинам (по
одной дисциплине предусмотрены и зачет, и экзамен)
На каждую специальность по 8 дисциплин [ 4 на семестр D: ]
*/
INSERT INTO [Дисциплина]([Название], [КодСпециальности], [Семестр], [Объём], [Отчётность])
VALUES (N'История России', @firstSpecialityID, 1, 120, N'Зачёт'),
(N'Алгебра и геометрия', @firstSpecialityID, 1, 120, N'Зачёт'),
(N'Математический анализ', @firstSpecialityID, 1, 240, N'Зачёт и Экзамен'),
(N'Теория вероятностей', @firstSpecialityID, 1, 180, N'Экзамен'),
(N'Основы программирования', @firstSpecialityID, 2, 120, N'Зачёт'),
(N'Алгоритмы и структуры данных', @firstSpecialityID, 2, 120, N'Зачёт'),
(N'Теория и практика речевого общения', @firstSpecialityID, 2, 240, N'Зачёт и Экзамен'),
(N'Философия', @firstSpecialityID, 2, 180, N'Экзамен'),
(N'История России', @firstSpecialityID + 2, 1, 120, N'Зачёт'),
(N'Алгебра и геометрия', @firstSpecialityID + 2, 1, 120, N'Зачёт'),
(N'Математический анализ', @firstSpecialityID + 2, 1, 240, N'Зачёт и Экзамен'),
(N'Теория вероятностей', @firstSpecialityID + 2, 1, 180, N'Экзамен'),
(N'Решение оптимизационных задач программными средствами', @firstSpecialityID + 2, 2, 120, N'Зачёт'),
(N'Базы данных', @firstSpecialityID + 2, 2, 120, N'Зачёт'),
(N'Теория и практика речевого общения', @firstSpecialityID + 2, 2, 240, N'Зачёт и Экзамен'),
(N'Философия', @firstSpecialityID + 2, 2, 180, N'Экзамен'),
(N'Архитектура информационных систем', @firstSpecialityID + 3, 1, 120, N'Зачёт'),
(N'Автоматизированное управление бизнес-процессами и финансами', @firstSpecialityID + 3, 1, 120, N'Зачёт'),
(N'Теория и практика речевого общения', @firstSpecialityID + 3, 1, 240, N'Зачёт и Экзамен'),
(N'Философия', @firstSpecialityID + 3, 1, 180, N'Экзамен'),
(N'Космические информационные системы и технологии', @firstSpecialityID + 3, 2, 120, N'Зачёт'),
(N'Безопасность и защита программных систем', @firstSpecialityID + 3, 2, 120, N'Зачёт'),
(N'Вычислительные машины, системы, комплексы и сети', @firstSpecialityID + 3, 2, 240, N'Зачёт и Экзамен'),
(N'Теория вероятностей', @firstSpecialityID + 3, 2, 180, N'Экзамен'),
(N'Нейронные сети', @firstSpecialityID + 5, 1, 120, N'Зачёт'),
(N'Операционные системы и ядра', @firstSpecialityID + 5, 1, 120, N'Зачёт'),
(N'Теория и практика речевого общения', @firstSpecialityID + 5, 1, 240, N'Зачёт и Экзамен'),
(N'Философия', @firstSpecialityID + 5, 1, 180, N'Экзамен'),
(N'Цифровые технологии сложных инженерных объектов', @firstSpecialityID + 5, 2, 120, N'Зачёт'),
(N'Разработка программно-информационных систем', @firstSpecialityID + 5, 2, 120, N'Зачёт'),
(N'Корпоративные информационные системы', @firstSpecialityID + 5, 2, 240, N'Зачёт и Экзамен'),
(N'Компьютерные системы и сети', @firstSpecialityID + 5, 2, 180, N'Экзамен');
DECLARE @firstDisciplineID INT = (SELECT TOP 1 ID
FROM [Дисциплина]
ORDER BY ID);
INSERT INTO [Преподавание]([Дисциплина], [Преподаватель])
VALUES (@firstDisciplineID, @firstTeacherID),
(@firstDisciplineID + 1, @firstTeacherID + 1),
(@firstDisciplineID + 2, @firstTeacherID + 2),
(@firstDisciplineID + 3, @firstTeacherID + 3);
DECLARE @copyFirstDisciplineID INT = @firstDisciplineID;
WHILE EXISTS(SELECT *
FROM [Дисциплина]
WHERE ID = @copyFirstDisciplineID)
BEGIN
INSERT INTO [Преподавание]([Дисциплина], [Преподаватель])
VALUES (@copyFirstDisciplineID, (SELECT TOP 1 [ТабельныйНомер] FROM [Преподаватель] ORDER BY NEWID()));
SET @copyFirstDisciplineID = @copyFirstDisciplineID + 1;
END
INSERT INTO [Изучение]([Студент], [Дисциплина], [Дата], [Оценка])
SELECT TOP 50 S.[НомерЗачетнойКнижки],
D.ID,
DATEADD(DAY, 40 + (CHECKSUM(NEWID()) % 30), '2020-01-01'),
IIF(D.Отчётность = N'Зачёт', (0 + ABS(CHECKSUM(NEWID())) % 2), (2 + ABS(CHECKSUM(NEWID())) % 4))
FROM [Студент] AS S,
[Дисциплина] AS D
ORDER BY NEWID()
COMMIT TRANSACTION