Advertisement
PavloSerg

Untitled

Mar 23rd, 2023
1,107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 13.62 KB | None | 0 0
  1. --1. Без параметров
  2. --Меню на текущую дату
  3.  
  4. DROP PROCEDURE GetMenuToday
  5.  
  6. CREATE or alter procedure GetMenuToday as
  7. (select name as N'Название', price + extra as N'Цена'
  8.  from Products
  9.  where availability_tomorrow = 1)
  10.  
  11.     exec GetMenuToday;
  12.  
  13.     --2. С входными параметрами
  14. --Сформировать заказ для конкретного клиета(параметр): три его наиболее любимых продукта, по 2 порции
  15.  
  16.     DROP PROCEDURE GetThreeBestProductByClient
  17.     CREATE or alter procedure GetThreeBestProductByClient @ClientName nvarchar(255) as
  18.     (select top 3 p.name, 2 as Portions
  19.      from orders
  20.               join rel_orders_products rop on orders.id = rop.order_id
  21.               join products p on p.id = rop.product_id
  22.      where customer_name = @ClientName
  23.      group by p.name)
  24.  
  25.         exec GetThreeBestProductByClient N'admin';
  26.  
  27.         --3 Входные и выходные параметры
  28. --Найти наименее и наиболее популярный продукт
  29. --Взял для входного параметра: цена, выше которой будет проходить выборка
  30.  
  31.         DROP PROCEDURE Foo
  32.         CREATE or alter procedure Foo @MinimalPrice INT = 30, @Result nvarchar(255) OUTPUT as
  33.         begin
  34.             declare @TheBestProduct nvarchar(255),
  35.                 @NotTheBestProduct nvarchar(255);
  36.             declare @SavedProductListWithRank table
  37.                                               (
  38.                                                   [Name] NVARCHAR(255),
  39.                                                   [rnk1] int,
  40.                                                   [rnk2] int
  41.                                               );
  42.             with ProductList as (select p2.name, count(*) as CountProduct
  43.                                  from orders
  44.                                           join rel_orders_products rop2 on orders.id = rop2.order_id
  45.                                           join products p2 on p2.id = rop2.product_id
  46.                                  where p2.price + p2.extra >= @MinimalPrice
  47.                                  group by p2.name),
  48.                  ProductListWithRank as (select name                                           as Name,
  49.                                                 dense_rank() over (order by CountProduct)      as rnk1,
  50.                                                 dense_rank() over (order by CountProduct desc) as rnk2
  51.                                          from ProductList)
  52.             insert
  53.             into @SavedProductListWithRank
  54.             select *
  55.             from ProductListWithRank;
  56.  
  57.             select @TheBestProduct = name
  58.             from @SavedProductListWithRank
  59.             where rnk2 = 1;
  60.  
  61.             select @NotTheBestProduct = name
  62.             from @SavedProductListWithRank
  63.             where rnk1 = 1;
  64.  
  65.             set @Result = N'Наименее продукт: ' + @TheBestProduct + N', наиболее продукт: ' + @NotTheBestProduct
  66.         end
  67.  
  68.         declare @FooResult NVARCHAR(255);
  69.             exec Foo default, @FooResult output;
  70.             print @FooResult;
  71.  
  72.  
  73.             --4. Вложенные процедуры
  74. --отчет по наименее и наиболее популярным продуктам
  75. --дата, продукт, количество
  76.             DROP PROCEDURE GetProductsByDate
  77.             CREATE or alter procedure GetProductsByDate @Date date, @Result nvarchar(255) OUTPUT as
  78.             begin
  79.                 declare @TheBestProduct nvarchar(255),
  80.                     @NotTheBestProduct nvarchar(255);
  81.                 declare @SavedProductListWithRank table
  82.                                                   (
  83.                                                       [Name]  NVARCHAR(255),
  84.                                                       [Count] nvarchar(255),
  85.                                                       [rnk1]  int,
  86.                                                       [rnk2]  int
  87.                                                   );
  88.                 with ProductList as (select p2.name, count(*) as CountProduct
  89.                                      from orders
  90.                                               join rel_orders_products rop2 on orders.id = rop2.order_id
  91.                                               join products p2 on p2.id = rop2.product_id
  92.                                      where date = @Date
  93.                                      group by p2.name),
  94.                      ProductListWithRank as (select name                                           as Name,
  95.                                                     CountProduct                                   as Count,
  96.                                                     dense_rank() over (order by CountProduct)      as rnk1,
  97.                                                     dense_rank() over (order by CountProduct desc) as rnk2
  98.                                              from ProductList)
  99.                 insert
  100.                 into @SavedProductListWithRank
  101.                 select *
  102.                 from ProductListWithRank;
  103.  
  104.                 select @NotTheBestProduct = name + '(' + Count + ')'
  105.                 from @SavedProductListWithRank
  106.                 where rnk2 = 1;
  107.  
  108.                 select @TheBestProduct = name + '(' + Count + ')'
  109.                 from @SavedProductListWithRank
  110.                 where rnk1 = 1;
  111.  
  112.                 set @Result = N'Наименее продукт: ' + @TheBestProduct + N', наиболее продукт: ' + @NotTheBestProduct
  113.             end
  114.  
  115.                 --declare @FooResult NVARCHAR(255);
  116.                 --exec GetProductsByDate '2022-11-15', @FooResult output;
  117.                 --print @FooResult;
  118.  
  119.                 drop proc PrintProductsTopAtAllDates;
  120.  
  121.                 CREATE or alter procedure PrintProductsTopAtAllDates as
  122.                 begin
  123.                     DECLARE Dates_Curcor CURSOR SCROLL FOR
  124.                         SELECT distinct o.date
  125.                         from orders as o;
  126.                     declare @Date date;
  127.                     declare @FooResult NVARCHAR(255);
  128.  
  129.                     open Dates_Curcor
  130.                     FETCH NEXT FROM Dates_Curcor INTO @Date
  131.  
  132.                     WHILE @@FETCH_STATUS = 0
  133.                         begin
  134.  
  135.                             exec GetProductsByDate @Date, @FooResult output;
  136.                             print @Date
  137.                             print @FooResult;
  138.  
  139.                             FETCH NEXT FROM Dates_Curcor INTO @Date
  140.                         end
  141.  
  142.                     CLOSE Dates_Curcor
  143.                     DEALLOCATE Dates_Curcor
  144.                 end
  145.  
  146.                     exec PrintProductsTopAtAllDates;
  147.  
  148.                     --Функции
  149. --1. Скалярная
  150. --Подсчитывает выручку на текущую дату
  151.  
  152.                     create or alter function GetViruchka(@date date)
  153.                         returns int
  154.                     as
  155.                     begin
  156.                         declare @Viruchka int;
  157.  
  158.                         select @Viruchka = sum(extra)
  159.                         from orders
  160.                                  join rel_orders_products rop3 on orders.id = rop3.order_id
  161.                                  join products p3 on p3.id = rop3.product_id
  162.                         where date = @date
  163.                         if @Viruchka is null
  164.                             SET @Viruchka = 0
  165.                         return @Viruchka
  166.                     end
  167.  
  168.                 declare @date date = '2022-11-15';
  169.                     --declare @date date = GETDATE();
  170.                     print N'Выручка: ' + CAST(SeregaTheDed_SQLLogin_1.GetViruchka(@date) as varchar)
  171.                     --2. Inline
  172. --произошло массовое отравление, предположительно продуктом К
  173. --Выдать список заказов(всю возможную информацию) по этому продукту на конкретную дату
  174.  
  175.                     create or alter function GetBadOrdersByDate(@date date, @badProductName nvarchar(255))
  176.                         returns table AS
  177.                             return
  178.                                 (
  179.                                     select p4.name, rop4.count, customer_name, date
  180.                                     from orders
  181.                                              join rel_orders_products rop4 on orders.id = rop4.order_id
  182.                                              join products p4 on p4.id = rop4.product_id
  183.                                     where date = @date
  184.                                       and p4.name = @badProductName
  185.                                 )
  186.  
  187.  
  188.                 declare @date date = '2022-11-30';
  189.                 declare @productName nvarchar(255) = N'мышь жаренная';
  190.  
  191.                 SELECT *
  192.                 FROM SeregaTheDed_SQLLogin_1.GetBadOrdersByDate(@date, @productName)
  193.                     --3. Multi-statement
  194. --Университет решил оплатить 10% расходов на питание за прошедший год.
  195. --Вывод
  196. --Заказчик, январь, февраль, ..., декабрь
  197. --в ячейках выплаты
  198.  
  199.  
  200.                     create or alter function GetCustomerList()
  201.                         returns table AS
  202.                             return
  203.                                 (
  204.                                     select distinct customer_name
  205.                                     from orders
  206.                                 )
  207.  
  208.                     drop function SeregaTheDed_SQLLogin_1.GetRollbackCustomer
  209.  
  210.                     create or alter function GetRollbackCustomer()
  211.                         returns @RollbackCustomerTable TABLE
  212.                                                        (
  213.                                                            Customer NVARCHAR(255) NOT NULL,
  214.                                                            [01]     float default (0),
  215.                                                            [02]     float default (0),
  216.                                                            [03]     float default (0),
  217.                                                            [04]     float default (0),
  218.                                                            [05]     float default (0),
  219.                                                            [06]     float default (0),
  220.                                                            [07]     float default (0),
  221.                                                            [08]     float default (0),
  222.                                                            [09]     float default (0),
  223.                                                            [10]     float default (0),
  224.                                                            [11]     float default (0),
  225.                                                            [12]     float default (0)
  226.                                                        )
  227.                     AS
  228.                     begin
  229.                         declare @CurrentCustomerName nvarchar(255);
  230.                         declare CustomersCursor cursor scroll for select * from SeregaTheDed_SQLLogin_1.GetCustomerList();
  231.  
  232.                         open CustomersCursor;
  233.  
  234.  
  235.                         FETCH NEXT FROM CustomersCursor INTO @CurrentCustomerName
  236.                         while @@fetch_status = 0
  237.                             begin
  238.                                 insert into @RollbackCustomerTable(Customer)
  239.                                 values (@CurrentCustomerName);
  240.  
  241.                                 declare @CurrentMonthNumber int = 1;
  242.                                 while @CurrentMonthNumber <= 12
  243.                                     begin
  244.                                         declare @TotalMonthAmount float;
  245.                                         select @TotalMonthAmount = sum(p5.price + p5.extra)
  246.                                         from orders o
  247.                                                  join rel_orders_products rop5 on o.id = rop5.order_id
  248.                                                  join products p5 on p5.id = rop5.product_id
  249.                                         where customer_name = @CurrentCustomerName
  250.                                           and month(date) = @CurrentMonthNumber;
  251.  
  252.                                         declare @KostilQuery nvarchar(max);
  253.                                         set @KostilQuery =
  254.                                         'update @RollbackCustomerTable
  255.                                        set [' + FORMAT(@CurrentMonthNumber, '00') + '] = ' + CAST((@TotalMonthAmount * 0.1) as nvarchar(255)) +
  256.                                         'where Customer = N'''+ @CurrentCustomerName+'''';
  257.                                         --exec(@KostilQuery);
  258.                                         sp_executesql @KostilQuery;
  259.                                         --exec @KostilQuery;
  260.                                         set @CurrentMonthNumber = @CurrentMonthNumber + 1;
  261.                                     end
  262.  
  263.                                     FETCH NEXT FROM CustomersCursor INTO @CurrentCustomerName
  264.                             end
  265.  
  266.                         close CustomersCursor;
  267.                         deallocate CustomersCursor;
  268.                         return
  269.                     end
  270.  
  271.  
  272.                     select *
  273.                     from SeregaTheDed_SQLLogin_1.GetRollbackCustomer()
  274.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement