Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
17.06.2021
Размер:
26.2 Кб
Скачать
USE Склад_336
GO

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

-- Для присвоения значения переменным можно использовать
-- команды SET и SELECT:
SET @Код = 10
SET @Имя = 'MS SQL Server'
SET @Цена = 299.99

-- Команда SELECT отличается от команды SET тем, что позволяет
-- присвоить значения сразу нескольким переменным:
SELECT @Код = 10, @Имя = 'MS SQL Server', @Цена = 299.99

-- Для вывода (на экран монитора) значений переменных также
-- используется команда SELECT:
SELECT @Код, @Имя, @Цена

-- При выводе значений переменных можно снабдить их содержательными
-- именами. При этом идентификаторы, содержащие недопустимые символы,
-- такие как ' ' (пробел), '%', '*' и др., должны быть заключены в
-- квадратные скобки:
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[Цена товара]

-- Связку AS можно, при желании, опускать:
SELECT @Код [Код товара], @Имя Наименование, @Цена [Цена товара]
GO

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')

SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[Цена товара]
GO

DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY

-- Выборка данных из таблицы Товар с сортировкой строк
-- по столбцу Цена в порядке возрастания
SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
ORDER BY Цена

-- Вывод данных о товаре с наибольшей ценой
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[MAX цена товара]

-- Выборка данных из таблицы Товар с сортировкой строк по столбцу Цена
-- в порядке убывания
SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
ORDER BY Цена DESC -- DESC указывает на убывающий порядок сортировки

-- Вывод данных о товаре с наименьшей ценой
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[MIN цена товара]
GO

DECLARE @Цена MONEY

SELECT @Цена = AVG(Цена)
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
-- Вывод средней цены товаров
SELECT @Цена AS [AVG цена товаров]
GO

DECLARE @Name VARCHAR(50), @Code INT, @Quantity NUMERIC(12,3),
@N INT
SET @N = 6000
SELECT @Code = КодТовара, @Quantity = SUM(Количество)
FROM Заказ
WHERE ДатаЗаказа BETWEEN GetDate() - @N AND GetDate()
GROUP BY КодТовара
ORDER BY SUM(Количество)

SELECT @Name = Наименование
FROM Товар
WHERE КодТовара = @Code

--SELECT @Name, @Quantity, @N
SELECT @Name AS [Наименование товара], @Quantity AS
[Итоговое кол-во], @N AS [Временной интервал]
GO

CREATE TABLE #Goods (
КодТовара INT PRIMARY KEY,
Наименование VARCHAR(50) NOT NULL,
ЕдиницаИзм CHAR(10) NULL
)

INSERT #Goods
SELECT КодТовара, Наименование, ЕдиницаИзм
FROM Товар

SELECT * FROM #Goods
GO

SELECT Наименование, Цена, КодВалюты
INTO #Goods_2
FROM Товар

SELECT * FROM #Goods_2
GO

--ПРОЦЕДУРЫ
/* Выбор всех регионов Беларуси */
CREATE PROCEDURE pr_ДанныеРегионов;1 AS
SELECT *
FROM Регион
WHERE Страна = 'Беларусь'
GO
/* Проверка работы хранимой процедуры pr_ДанныеРегионов;1 */
EXEC pr_ДанныеРегионов;1
GO

/* Выбор всех регионов конкретной страны */
CREATE PROCEDURE pr_ДанныеРегионов;2
@Страна VARCHAR(20) = 'Беларусь' AS
SELECT *
FROM Регион
WHERE Страна = @Страна
GO
/* Проверка работы хранимой процедуры pr_ДанныеРегионов;2 */
EXEC pr_ДанныеРегионов;2 -- выбираются регионы Беларуси
EXEC pr_ДанныеРегионов;2 'Россия' -- выбираются регионы России
EXEC pr_ДанныеРегионов;2 'Украина' -- выбираются регионы Украины
GO

/* Выбор регионов, связанных со страной и/или городом */
CREATE PROCEDURE pr_ДанныеРегионов;3
@Страна VARCHAR(20) = 'Беларусь',
@Город VARCHAR(20) = NULL
AS
IF @Страна IS NOT NULL
BEGIN
IF @Город IS NOT NULL
SELECT *
FROM Регион
WHERE Страна = @Страна AND Город = @Город
ELSE
SELECT *
FROM Регион
WHERE Страна = @Страна
END
ELSE
IF @Город IS NOT NULL
SELECT *
FROM Регион
WHERE Город = @Город
GO
/* Проверка работы хранимой процедуры pr_ДанныеРегионов;3 */
EXEC pr_ДанныеРегионов;3
EXEC pr_ДанныеРегионов;3 @Город = 'Минск'
EXEC pr_ДанныеРегионов;3 DEFAULT, 'Воложин'
EXEC pr_ДанныеРегионов;3 'Россия'
EXEC pr_ДанныеРегионов;3 NULL, 'Алушта'
GO

/* Вставка новой строки в таблицу "Валюта" */
CREATE PROCEDURE pr_ВставкаВалюты
@Код CHAR(3),
@Имя VARCHAR(30),
@Курс SMALLMONEY = 1000,
@Шаг NUMERIC(10, 4) = 0.01
AS
INSERT INTO Валюта
VALUES(@Код, @Имя, @Шаг, @Курс)
GO
/* Проверка работы хранимой процедуры pr_ВставкаВалюты */
EXEC pr_ВставкаВалюты 'WWW', 'Валюта страны W'
EXEC pr_ВставкаВалюты 'XXX', 'Валюта страны X', 500, 1
EXEC pr_ВставкаВалюты 'YYY', 'Валюта страны Y', 250
EXEC pr_ВставкаВалюты 'ZZZ', 'Валюта страны Z', @Шаг = 50
SELECT * FROM Валюта
GO

/* Выбор курса валюты по ее коду */
CREATE PROCEDURE pr_ВыборКурсаВалюты
@Код CHAR(3),
@Курс SMALLMONEY OUTPUT
AS
IF @Код IS NOT NULL
SELECT @Курс = КурсВалюты
FROM Валюта
WHERE КодВалюты = @Код
ELSE
SELECT @Курс = КурсВалюты
FROM Валюта
WHERE КодВалюты = 'USD'
GO
/* Проверка работы хранимой процедуры pr_ВыборКурсаВалюты */
DECLARE @Code CHAR(3), @Course SMALLMONEY
SET @Code = 'EUR'

EXEC pr_ВыборКурсаВалюты @Code, @Course OUTPUT
SELECT @Code AS [Код валюты], @Course AS [Курс валюты]

EXEC pr_ВыборКурсаВалюты NULL, @Course OUTPUT
SELECT 'USD' AS [Код валюты], @Course AS [Курс валюты]
GO

/* Выбор имени клиента и ФИО руководителя по коду клиента */
CREATE PROCEDURE pr_ДанныеКлиента;1
@Код INT,
@Имя VARCHAR(40) OUTPUT,
@ФИО VARCHAR(60) OUTPUT
AS
SELECT @Имя = ИмяКлиента, @ФИО = ФИОРуководителя
FROM Клиент
WHERE КодКлиента = @Код
GO
/* Проверка работы хранимой процедуры pr_ДанныеКлиента;1 */
DECLARE @Code INT, @Name VARCHAR(40), @FIO VARCHAR(60)
SET @Code = 5
EXEC pr_ДанныеКлиента;1 @Code, @Name OUTPUT, @FIO OUTPUT
SELECT @Name AS [Имя клиента], @FIO AS [ФИО руководителя]
GO

/* Выбор данных о клиенте по любому из трех параметров */
CREATE PROCEDURE pr_ДанныеКлиента;2
@Код INT = NULL OUTPUT,
@Имя VARCHAR(40) = NULL OUTPUT,
@ФИО VARCHAR(60) = NULL OUTPUT
AS
IF @Код IS NOT NULL
SELECT @Имя = ИмяКлиента, @ФИО = ФИОРуководителя
FROM Клиент
WHERE КодКлиента = @Код
ELSE
IF @Имя IS NOT NULL
SELECT @Код = КодКлиента, @ФИО = ФИОРуководителя
FROM Клиент
WHERE ИмяКлиента = @Имя
ELSE
IF @ФИО IS NOT NULL
SELECT @Код = КодКлиента, @Имя = ИмяКлиента
FROM Клиент
WHERE ФИОРуководителя = @ФИО
GO
/* Проверка работы хранимой процедуры pr_ДанныеКлиента;2 */
DECLARE @Code INT, @Name VARCHAR(40), @FIO VARCHAR(60)
SET @Code = 1
EXEC pr_ДанныеКлиента;2 @Code, @Name OUTPUT, @FIO OUTPUT
SELECT @Code AS [Код клиента], @Name AS [Имя клиента],
@FIO AS [ФИО руководителя]

SET @Code = NULL
SET @Name = 'ИП "Темп"'
EXEC pr_ДанныеКлиента;2 @Code OUTPUT, @Name, @FIO OUTPUT
SELECT @Code AS [Код клиента], @Name AS [Имя клиента],
@FIO AS [ФИО руководителя]

SET @Code = NULL
SET @Name = NULL
SET @FIO = 'Прокушев Станислав Игоревич'
EXEC pr_ДанныеКлиента;2 @Code OUTPUT, @Name OUTPUT, @FIO
SELECT @Code AS [Код клиента], @Name AS [Имя клиента],
@FIO AS [ФИО руководителя]
GO

/* Процедура создания и наполнения данными глобальной временной таблицы */
CREATE PROCEDURE pr_КопияРегионов
@Страна VARCHAR(20) = 'Беларусь',
@Город VARCHAR(20) = 'Минск'
AS
IF @Страна IS NOT NULL
IF @Город IS NOT NULL
SELECT *
INTO ##Регион
FROM Регион
WHERE Страна = @Страна AND Город = @Город
GO
/* Проверка работы хранимой процедуры pr_КопияРегионов */
EXEC pr_КопияРегионов
SELECT * FROM ##Регион

DROP TABLE ##Регион
EXEC pr_КопияРегионов @Город = 'Полоцк'
SELECT * FROM ##Регион

DROP TABLE ##Регион
EXEC pr_КопияРегионов DEFAULT, 'Воложин'
SELECT * FROM ##Регион

DROP TABLE ##Регион
EXEC pr_КопияРегионов 'Россия', 'Королев'
SELECT * FROM ##Регион
GO

ALTER PROCEDURE pr_ВыборКурсаВалюты
@Код CHAR(3) = 'USD',
@Курс SMALLMONEY OUTPUT
AS
SELECT @Курс = КурсВалюты
FROM Валюта
WHERE КодВалюты = @Код
GO
/* Проверка работы скорректированной хранимой процедуры pr_ВыборКурсаВалюты */
DECLARE @Code CHAR(3), @Course SMALLMONEY
SET @Code = 'EUR'

EXEC pr_ВыборКурсаВалюты @Code, @Course OUTPUT
SELECT @Code AS [Код валюты], @Course AS [Курс валюты]

EXEC pr_ВыборКурсаВалюты @Курс = @Course OUTPUT
SELECT 'USD' AS [Код валюты], @Course AS [Курс валюты]

EXEC pr_ВыборКурсаВалюты DEDAULT, @Course OUTPUT
SELECT 'USD' AS [Код валюты], @Course AS [Курс валюты]
GO

GRANT EXECUTE
ON pr_ВыборКурсаВалюты TO [Гл.бухгалтер] WITH GRANT OPTION
GO

DROP PROCEDURE pr_ДанныеРегионов, pr_ВставкаВалюты
GO

/* Функция типа Scalar, возвращающая курс валюты по ее коду */
CREATE FUNCTION fn_ВыборКурсаВалюты
(@Код CHAR(3))
RETURNS SMALLMONEY
BEGIN
DECLARE @Курс SMALLMONEY --объявляем локальную переменную @Курс

SELECT @Курс = КурсВалюты
FROM Валюта
WHERE КодВалюты = @Код

RETURN @Курс --функция возвращает значение переменной @Курс
END
GO
/* Проверка работы функции func_ВыборКурсаВалюты */
DECLARE @Code CHAR(3)
SET @Code = 'USD'
SELECT @Code AS [Код валюты], dbo.fn_ВыборКурсаВалюты(@Code)
AS [Курс валюты]
GO

/* Функция типа Inline Table-valued, возвращающая заказы по валюте*/
CREATE FUNCTION fn_ВыборЗаказовПоВалюте
(@Код CHAR(3))
RETURNS TABLE
AS RETURN
SELECT Заказ.*, Товар.КодВалюты
FROM Заказ INNER JOIN Товар
ON Заказ.КодТовара = Товар.КодТовара
WHERE Товар.КодВалюты = @Код
GO
/* Проверка работы функции func_ВыборЗаказовПоВалюте */
SELECT * FROM fn_ВыборЗаказовПоВалюте('USD')
GO

/* Функция типа Multi-statement Table-valued, возвращающая таблицу с новым столбцом */
CREATE FUNCTION fn_ВыборРегионовСтраны
(@Страна VARCHAR(20))
RETURNS @CountryRegions TABLE (
КодРегиона INT PRIMARY KEY,
Страна VARCHAR(20) NOT NULL,
Город VARCHAR(20) NULL,
ОбластнойЦентр BIT NULL)
BEGIN
-- Объявляем локальную переменную @rowset типа таблица
DECLARE @rowset TABLE (
КодРегиона INT PRIMARY KEY,
Страна VARCHAR(20) NOT NULL,
Область VARCHAR(20) NULL,
Город VARCHAR(20) NULL,
ОбластнойЦентр BIT DEFAULT 0 NULL)

-- Заносим данные в локальную переменную @rowset
INSERT @rowset (КодРегиона, Страна, Область, Город)
SELECT КодРегиона, Страна, Область, Город
FROM Регион
WHERE Страна = @Страна

-- Заносим данные в столбец "ОбластнойЦентр" переменной @rowset
UPDATE @rowset
SET ОбластнойЦентр = 1
WHERE Область = ''

-- Заносим данные в результирующую переменную @CountryRegion типа таблица, т.к.
-- локальная переменная @rowset после выхода из функции автоматически уничтожается
INSERT @CountryRegions
SELECT КодРегиона, Страна, Город, ОбластнойЦентр
FROM @rowset

RETURN
END
GO
/* Проверка работы функции fn_ВыборРегионовСтраны */
SELECT * FROM fn_ВыборРегионовСтраны('Беларусь')
SELECT * FROM fn_ВыборРегионовСтраны('Россия')
GO

---------------- Задание к работе ----------------

USE Склад_336
GO


/*1.Создайте хранимую процедуру pr_КолебанияСпросаТоваров, которая решает рассмотренную выше (см. раздел I) задачу определения наименования товара,
по которому был наибольший или наименьший спрос за последние N дней. Эта процедура должна иметь два входных параметра (@Интервал, @ТипРезультата) и
два выходных параметра (@Имя, @Итог). Если значение входного параметра @ТипРезультата равно 1,находится товар наибольшего спроса.
Если же значение параметра равно 2 – находится товар наименьшего спроса.*/

CREATE PROCEDURE pr_КолебанияСпросаТоваров
@Интервал INT ,
@ТипРезультата INT,
@Имя CHAR(20) OUTPUT,
@Итог INT OUTPUT
AS
DECLARE @Max INT, @Min INT
IF @ТипРезультата = 1
BEGIN
SELECT @Итог = КодТовара, @Max = SUM(Количество)
FROM Заказ
WHERE ДатаЗаказа BETWEEN GetDate() - @Интервал AND GetDate()
GROUP BY КодТовара
ORDER BY SUM(Количество)
SELECT @Имя = Наименование
FROM Товар
WHERE КодТовара = @Итог
END
ELSE
BEGIN
SELECT @Итог = КодТовара, @Min = SUM(Количество)
FROM Заказ
WHERE ДатаЗаказа BETWEEN GETDATE() - @Интервал AND GETDATE()
GROUP BY КодТовара
ORDER BY SUM(Количество) DESC
SELECT @Имя = Наименование
FROM Товар
WHERE КодТовара = @Итог
END
GO



DECLARE @Интервал1 INT, @ТипРезультата1 INT, @Имя1 char(20) , @Итог1 INT
SELECT @Интервал1 = 1000, @ТипРезультата1 = 1
EXEC pr_КолебанияСпросаТоваров @Интервал1, @ТипРезультата1 , @Имя1 OUTPUT, @Итог1 OUTPUT
SELECT @Имя1 AS [Наименование], @Итог1 AS [Код Товара]
GO

DROP PROCEDURE pr_КолебанияСпросаТоваров -- удаляем проецедуру
GO

/*2.Создайте хранимую процедуру pr_КлиентПоставщик_СтранаИнтервал, которая подсчитывает, сколько различных клиентов и различных поставщиков из указанной
страны фигурирует в таблице Заказ, причем анализируются только те заказы, в которых значение поля Дата заказа попадает в указанный интервал дат. Эта процедура
должна иметь три входных параметра (@Страна, @НачалоИнтервала, @КонецИнтервала) и два выходных параметра (@ЧислоКлиентов, @ЧислоПоставщиков). Если же значение
параметра @Страна не будет указано (т.е. будет равно NULL), то подсчет клиентов и поставщиков должен вестись независимо от их национальной принадлежности.*/

DROP PROCEDURE pr_КлиентПоставщик_СтранаИнтервал
CREATE PROCEDURE pr_КлиентПоставщик_СтранаИнтервал;1
@Страна VARCHAR(30),
@НачалоИнтервала DATETIME,
@КонецИнтервала DATETIME,
@ЧислоКлиентов INT OUTPUT,
@ЧислоПоставщиков INT OUTPUT
AS
DECLARE @КодПоставщика INT, @КодКлиента INT
SELECT @ЧислоПоставщиков = 0, @ЧислоКлиентов = 0
IF @Страна IS NULL
SELECT @ЧислоПоставщиков = @ЧислоПоставщиков + 1
FROM Заказ
INNER JOIN Поставщик ON Заказ.КодПоставщика = Поставщик.КодПоставщика
INNER JOIN Регион ON Поставщик.КодРегиона = Регион.КодРегиона
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала)
GROUP BY Заказ.КодПоставщика
IF @Страна IS NULL
SELECT @ЧислоКлиентов = @ЧислоКлиентов + 1
FROM Заказ
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала)
GROUP BY Заказ.КодКлиента
IF @Страна IS NOT NULL
SELECT @ЧислоПоставщиков = @ЧислоПоставщиков + 1
FROM Заказ
INNER JOIN Поставщик ON Заказ.КодПоставщика = Поставщик.КодПоставщика
INNER JOIN Регион ON Поставщик.КодРегиона = Регион.КодРегиона
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала) AND Регион.Страна = @Страна
GROUP BY Заказ.КодПоставщика
IF @Страна IS NOT NULL
SELECT @ЧислоКлиентов = @ЧислоКлиентов + 1
FROM Заказ
INNER JOIN Клиент ON Заказ.КодКлиента = Клиент.КодКлиента
INNER JOIN Регион ON Клиент.КодРегиона = Регион.КодРегиона
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала) AND Регион.Страна = @Страна
GROUP BY Заказ.КодКлиента;
GO
/* Проверка работы хранимой процедуры pr_ДанныеРегионов;3 */
DECLARE @ЧислоКлиентов INT, @ЧислоПоставщиков INT
EXEC pr_КлиентПоставщик_СтранаИнтервал;1 NULL, '2021-03-10 00:00:00.000', '2021-04-06 00:00:00.000', @ЧислоКлиентов OUTPUT, @ЧислоПоставщиков OUTPUT
SELECT @ЧислоКлиентов AS [ЧислоКлиентов], @ЧислоПоставщиков AS [ЧислоПоставщиков]

EXEC pr_КлиентПоставщик_СтранаИнтервал;1 'Беларусь', '2021-03-10 00:00:00.000', '2021-04-06 00:00:00.000', @ЧислоКлиентов OUTPUT, @ЧислоПоставщиков OUTPUT
SELECT @ЧислоКлиентов AS [ЧислоКлиентов], @ЧислоПоставщиков AS [ЧислоПоставщиков]


/*3.Создайте хранимую процедуру pr_Товар_СтранаВалютаИнтервал, которая подсчитывает, сколько различных товаров в конкретной валюте было заказано клиентами
из указанной страны, причем анализируются только те заказы, в которых значение поля Дата заказа попадает в заданный интервал дат. Эта процедура должна иметь четыре
входных параметра (@Страна, @Валюта, @НачалоИнтервала, @КонецИнтервала) и один выходной параметр (@ЧислоТоваров). При этом расширьте возможности процедуры следующим
образом:
если значение параметра @Страна не будет указано (т.е. будет равно NULL), то подсчет товаров должен вестись независимо от национальной принадлежности клиента;
если значение параметра @Валюта не будет указано (т.е. будет равно NULL), то подсчет товаров должен вестись применительно к национальной валюте (код валюты – BYR).*/

CREATE PROCEDURE pr_Товар_СтранаВалютаИнтервал
@Страна VARCHAR(30),
@Валюта VARCHAR(30),
@НачалоИнтервала DATETIME,
@КонецИнтервала DATETIME
AS
DECLARE @ЧислоТоваров INT
SET @ЧислоТоваров = 0
IF @Валюта = 'BYR'
BEGIN
SELECT Заказ.КодТовара, Заказ.Количество
INTO #Товары1
FROM Заказ
INNER JOIN Клиент
ON Заказ.КодКлиента = Клиент.КодКлиента
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала)
SELECT @ЧислоТоваров = COUNT(DISTINCT Количество)
FROM #Товары1
INNER JOIN Товар ON #Товары1.КодТовара = Товар.КодТовара
WHERE Товар.КодВалюты = @Валюта
END

ELSE
BEGIN
SELECT Заказ.КодТовара, Заказ.Количество
INTO #Товары2
FROM Заказ
INNER JOIN Клиент
ON Заказ.КодКлиента = Клиент.КодКлиента
INNER JOIN Регион
ON Клиент.КодРегиона = Регион.КодРегиона
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала) AND Регион.Страна = @Страна

SELECT @ЧислоТоваров = COUNT(DISTINCT Количество)
FROM #Товары2
INNER JOIN Товар ON #Товары2.КодТовара = Товар.КодТовара
WHERE Товар.КодВалюты = @Валюта
END

SELECT @ЧислоТоваров [Количество различных товаров]
GO

EXEC pr_Товар_СтранаВалютаИнтервал 'Беларусь', BYR, "02.01.2006", "02.09.2021"
GO

DROP PROCEDURE pr_Товар_СтранаВалютаИнтервал
GO

/*4.Создайте пользовательскую функцию fn_getЧислоДней_вМесяце типа Scalar(скалярное значение любого из типов данных), которая для конкретной даты
возвращает число дней в месяце, который определяется этой датой (високосность года не учитывается). Эта функция должна иметь один входной параметр (@Дата).*/

CREATE FUNCTION fn_getЧислоДней_вМесяце
(@Дата DATETIME)
RETURNS INT
BEGIN
DECLARE @Days INT
SET @DAYS = DATEDIFF(DAY, @Дата, DATEADD(MONTH,1,@Дата))
RETURN @Days
END
GO

SET DATEFORMAT dmy
DECLARE @Дата1 DATETIME
SELECT @Дата1 = '16.05.2021'
SELECT dbo.fn_getЧислоДней_вМесяце(@Дата1) AS [Количество дней]
GO

DROP FUNCTION fn_getЧислоДней_вМесяце
GO

/*5.Создайте пользовательскую функцию fn_getФИО_вФормате типа Scalar, которая на основе текстовой строки, содержащей фамилию, имя и отчество,
формирует текстовую строку в одном из следующих форматов:
1) исходная строка переводится в верхний регистр;
2) исходная строка переводится в нижний регистр;
3) на верхнем регистре должны быть только первые буквы слов;
4) выводится только фамилия, а имя и отчество заменяются их первыми буквами с точкой.
Эта функция должна иметь два входных параметра (@ФИО, @Формат).*/

CREATE FUNCTION fn_getФИО_вФормате
(@ФИО CHAR(30), @Формат INT)
RETURNS CHAR(30)
BEGIN
DECLARE @RESULT CHAR(30)
DECLARE @surname CHAR(10)
DECLARE @name CHAR(10)
DECLARE @patronymic CHAR(10)
IF @Формат = 1
BEGIN
SELECT @RESULT = UPPER(@ФИО) --преобразует все символы строки в верхний регистр
END
IF @Формат = 2
BEGIN
SELECT @RESULT = LOWER(@ФИО) --нижниий
END
IF @Формат = 3
BEGIN /*CHARINDEX(substring, string, start)
SUBSTRING(string, start, length)*/
DECLARE @pos INT
SELECT @pos = CHARINDEX(' ', @ФИО)
SELECT @surname = SUBSTRING(@ФИО, 1, @pos-1)
SELECT @ФИО = SUBSTRING(@ФИО, @pos+1, LEN(@ФИО)-@pos)
SELECT @pos = CHARINDEX(' ', @ФИО)
SELECT @name = SUBSTRING(@ФИО, 1, @pos-1)
SELECT @ФИО = SUBSTRING(@ФИО, @pos+1, LEN(@ФИО)-@pos)
SELECT @patronymic = @ФИО
SELECT @RESULT = UPPER(LEFT(@surname,1))+LOWER(SUBSTRING(@surname,2,LEN(@surname)))+' '+
UPPER(LEFT(@name,1))+LOWER(SUBSTRING(@name,2,LEN(@name)))+' '+
UPPER(LEFT(@patronymic,1))+LOWER(SUBSTRING(@patronymic,2,LEN(@patronymic)))
RETURN @RESULT

END
IF @Формат = 4
BEGIN
SELECT @surname = SUBSTRING (@ФИО, 1, CHARINDEX(' ', @ФИО))
SELECT @surname = LOWER(@surname)
SELECT @surname = UPPER(LEFT(@surname,1))+SUBSTRING(@surname,2,LEN(@surname))
SELECT @name = SUBSTRING (@ФИО, CHARINDEX(' ', @ФИО)+1, CHARINDEX(' ', @ФИО,CHARINDEX(' ',LEN(@ФИО))))
SELECT @name = LOWER(@name)
SELECT @name = UPPER(LEFT(@name,1)) + '.'
SELECT @patronymic = SUBSTRING (@ФИО, CHARINDEX(' ', @ФИО,CHARINDEX(' ', @ФИО)+1)+1,LEN(@ФИО))
SELECT @patronymic = LOWER(@patronymic)
SELECT @patronymic = UPPER(LEFT(@patronymic,1)) + '.'
SELECT @RESULT = @surname + @name + @patronymic
END
RETURN @RESULT
END
GO

DECLARE @ФИО1 CHAR(30)
DECLARE @Формат1 INT
SET @ФИО1 ='Мкртчан Лиана Суреновна'
SELECT dbo.fn_getФИО_вФормате(@ФИО1,3) AS [Работа со строкой]
GO

DROP FUNCTION fn_getФИО_вФормате
GO

--6.Создайте пользовательскую функцию fn_getGroup_НаименованиеВалюта типа Inline Table-valued, которая возвращает
--таблицу со следующими столбцами:

--Наименование товара
--Имя валюты
--Заказанное кол-во
--Стоимость в национальной валюте

--Эта таблица должна отражать результат группировки данных по полям Наименование и ИмяВалюты. Для каждой
-- такой группы подсчитывается итоговое количество заказанного товара и итоговая стоимость в национальной валюте.
--Пользовательская функция fn_getGroup_НаименованиеВалюта должна иметь два входных параметра (@НачалоИнтервала, @КонецИнтервала),
-- поэтому при формировании результирующей таблицы необходимо учитывать только те строки из таблицы Заказ, в которых значение
-- поля Дата заказа попадает в указанный параметрами интервал дат.

CREATE FUNCTION fn_getGroup_НаименованиеВалюта
(@НачалоИнтервала DATE, @КонецИнтервала DATE)
RETURNS TABLE
AS RETURN
SELECT Товар.Наименование AS [Наименование товара], Валюта.ИмяВалюты AS [Имя валюты], SUM(Заказ.Количество) AS Количество, (SUM(Заказ.Количество) * Товар.Цена) AS [Стоимость в валюте]
FROM Заказ
INNER JOIN Товар ON Заказ.КодТовара = Товар.КодТовара
INNER JOIN Валюта ON Валюта.КодВалюты = Товар.КодВалюты
WHERE (Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND @КонецИнтервала)
GROUP BY Товар.Наименование, Валюта.ИмяВалюты, Товар.Цена
GO

SET DATEFORMAT dmy
SELECT * FROM fn_getGroup_НаименованиеВалюта('01.07.2008','15.07.2021')
GO

DROP FUNCTION fn_getGroup_НаименованиеВалюта
GO

--7.Создайте пользовательскую функцию fn_getTable_СтоимостьНВ типа Multi-statement Table-valued,
--которая возвращает таблицу со следующими столбцами:

/*Номер
Дата заказа
Имя клиента
Наименование товара
Количество
Цена в НВ
Стоимость в НВ*/

/*Эта таблица строится в три этапа.

Сначала создается таблица со столбцами, показанными выше, где столбец Номер является автоинкрементным первичным ключом,
столбцы Цена в НВ (цена в национальной валюте) и Стоимость в НВ (стоимость в национальной валюте) являются вычисляемыми.
Число строк этой таблицы будет равно числу строк в таблице Заказ.

На втором этапе подсчитывается средняя стоимость в национальной валюте всех заказанных товаров.

На третьем этапе из полученной таблицы удаляются все те строки, в которых значение столбца Стоимость в НВ будет меньше, чем подсчитанная на втором этапе
средняя стоимость в национальной валюте. В результате будет получена таблица, которую и должна возвращать данная пользовательская функция.
Эта функция не имеет ни одного входного параметра. */

CREATE FUNCTION fn_getTable_СтоимостьНВ ()
RETURNS @multi TABLE (
Номер INT IDENTITY(1,1) PRIMARY KEY,
ДатаЗаказа DATE NOT NULL,
ИмяКлиента VARCHAR(30) NOT NULL,
НаименованиеТовара VARCHAR(20) NOT NULL,
Количество INT NOT NULL,
ЦенаВНацВалюте INT NOT NULL,
СтоимостьВНацВалюте INT NOT NULL)
BEGIN

DECLARE @rowset TABLE (
Номер INT IDENTITY(1,1) PRIMARY KEY,
ДатаЗаказа DATE NOT NULL,
ИмяКлиента VARCHAR(30) NOT NULL,
НаименованиеТовара VARCHAR(20) NOT NULL,
Количество INT NOT NULL,
ЦенаВНацВалюте INT NULL,
СтоимостьВНацВалюте INT NULL)
INSERT @rowset (ДатаЗаказа, ИмяКлиента, НаименованиеТовара, Количество, ЦенаВНацВалюте, СтоимостьВНацВалюте)
SELECT ДатаЗаказа, ИмяКлиента, Наименование, Количество, Цена, (Цена*Количество)
FROM Заказ
INNER JOIN Клиент ON Заказ.КодКлиента=Клиент.КодКлиента
INNER JOIN Товар ON Заказ.КодТовара = Товар.КодТовара
DECLARE @Price INT
SELECT @Price=AVG(СтоимостьВНацВалюте)

FROM @rowset
DELETE
FROM @rowset
WHERE СтоимостьВНацВалюте < @Price
INSERT @multi
SELECT ДатаЗаказа, ИмяКлиента, НаименованиеТовара, Количество, ЦенаВНацВалюте, СтоимостьВНацВалюте
FROM @rowset
RETURN
END
GO

SELECT * FROM fn_getTable_СтоимостьНВ()
GO

DROP FUNCTION fn_getTable_СтоимостьНВ

/*Создать процедуру, в ней создать новую таблицу с полями A B C и здесь сделать insert ставим значение из 3 параметров в процедуру (в процедуру передается 3 параметра и их инсертим в процедуру)*/
ALTER PROCEDURE pr_dop
@A VARCHAR(30),
@B VARCHAR(30),
@C VARCHAR(30)
AS

DROP TABLE My_table
CREATE TABLE My_table (
A VARCHAR(30),
B VARCHAR(30),
C VARCHAR(30)
)
INSERT INTO My_table
VALUES (@A,@B,@C)

SELECT * FROM My_table

GO

DECLARE
@A VARCHAR(30) = '123',
@B VARCHAR(30) = '123',
@C VARCHAR(30) = '123'

EXECUTE pr_dop @A,@B,@C
GO
Соседние файлы в папке чужие лабы бд и прочее