Wacky_rubia

Lab4

Dec 9th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.94 KB | None | 0 0
  1. CREATE SCHEMA lab4
  2. GO
  3. drop table shop
  4. drop function GetPrice
  5. drop function GetPriceAndShop
  6. drop function GetPoint
  7. drop function GetSegments
  8.  
  9.  
  10.  
  11. create table shop
  12. (
  13. id int NOT NULL primary key IDENTITY(1,1),
  14. name nvarchar(30) NOT NULL,
  15. price int not null,
  16. delivery int not null,
  17. freeDelivery int
  18. )
  19. GO
  20.  
  21.  
  22. insert into shop (name, price, delivery)
  23. values (N'A', 280, 200)
  24. insert into shop (name, price, delivery, freeDelivery)
  25. values (N'B', 300, 270, 2000)
  26.  
  27. select * from shop
  28. go
  29.  
  30. CREATE FUNCTION GetPrice(@ShopId INT, @Count float)
  31. RETURNS INT
  32. AS
  33. BEGIN
  34.     DECLARE @Cost INT;
  35.     DECLARE @Delivery INT;
  36.     DECLARE @freeDelivery INT;
  37.  
  38.     SELECT @Cost = price
  39.     FROM shop
  40.     WHERE id = @ShopId
  41.     IF (@Cost IS NULL)
  42.        SET @Cost = 0;
  43.     SET @Cost = @Cost * @Count;
  44.  
  45.     SELECT @freeDelivery = freeDelivery
  46.     FROM shop
  47.     WHERE id = @ShopId
  48.  
  49.     SELECT @Delivery = delivery
  50.     FROM shop
  51.     WHERE id = @ShopId
  52.  
  53.     IF (@freeDelivery IS NULL)
  54.         RETURN @Cost + @Delivery
  55.     IF (@Cost > @freeDelivery)
  56.         RETURN @Cost
  57.     RETURN @Cost + @Delivery;
  58. END;
  59. GO
  60.  
  61. CREATE FUNCTION GetPriceAndShop(@Count float)
  62. RETURNS @PriceAndShopInformation TABLE
  63. (
  64.     Наименование_магазина nvarchar(50) NULL,
  65.     Стоимость float
  66. )
  67. AS
  68. BEGIN
  69.     DECLARE
  70.         @MinCost float,
  71.         @Наименование nvarchar(50)
  72.  
  73.     SELECT @MinCost = min(dbo.GetPrice(id, @Count))
  74.     from shop
  75.    
  76.     SELECT @Наименование = name
  77.     from shop
  78.     where (@MinCost = dbo.GetPrice(id, @Count))
  79.  
  80.     INSERT @PriceAndShopInformation
  81.         SELECT @Наименование, @MinCost
  82.     return;
  83. END;
  84. GO
  85.  
  86. select * from dbo.GetPriceAndShop(7);
  87. go
  88. CREATE FUNCTION GetPoint(@ShopId INT)
  89. RETURNS float
  90. AS
  91. BEGIN
  92.     DECLARE @Count float;
  93.     DECLARE @Price float;
  94.     DECLARE @freeDelivery float;
  95.    
  96.     SELECT @freeDelivery = freeDelivery
  97.     FROM shop
  98.     WHERE id = @ShopId
  99.  
  100.     SELECT @Price = price
  101.     FROM shop
  102.     WHERE id = @ShopId
  103.  
  104.     set @Count = @freeDelivery / @Price
  105.     return @Count;
  106. END;
  107. GO
  108.  
  109. CREATE FUNCTION GetSegments()
  110. RETURNS @Segments TABLE
  111. (
  112.     from_point float,
  113.     to_point float,
  114.     shop nvarchar(50)
  115. )
  116. AS
  117. BEGIN  
  118.     DECLARE @Points CURSOR
  119.     SET @Points = CURSOR SCROLL
  120.     FOR
  121.     select distinct dbo.GetPoint(id) as point
  122.             from shop
  123.             where shop.freeDelivery is not null
  124.             order by point;
  125.    
  126.     declare @point float,
  127.         @tmpPoint float,
  128.         @prevPoint float;
  129.     set @prevPoint = 0;
  130.     Open @Points;
  131.       FETCH @Points INTO @point;
  132.     WHILE @@FETCH_STATUS = 0
  133.     begin
  134.         set @tmpPoint = @point - 0.1
  135.         INSERT @Segments
  136.             select @prevPoint, @point, (select Наименование_магазина from dbo.GetPriceAndShop(@tmpPoint))
  137.         set @prevPoint = @point
  138.         FETCH @Points INTO @point;
  139.     END
  140.     set @tmpPoint = @point + 0.1
  141.     INSERT @Segments
  142.         select @prevPoint, 1.79E+308, (select Наименование_магазина from dbo.GetPriceAndShop(@tmpPoint))
  143.     return;
  144. END;
  145. GO
  146.  
  147.  
  148. select * from dbo.GetSegments();
Advertisement
Add Comment
Please, Sign In to add comment