Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
17.06.2021
Размер:
26 Кб
Скачать
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
Соседние файлы в папке чужие лабы бд и прочее