Guest User

Untitled

a guest
Dec 14th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.13 KB | None | 0 0
  1. USE master
  2. GO
  3.  
  4. IF EXISTS (
  5.     SELECT  name
  6.     FROM    sys.DATABASES
  7.     WHERE   name = N'GusarovVadim' )
  8. ALTER DATABASE [GusarovVadim] SET single_user WITH ROLLBACK immediate
  9. GO
  10.  
  11. IF EXISTS (
  12.     SELECT  name
  13.     FROM    sys.DATABASES
  14.     WHERE   name = N'GusarovVadim' )
  15. DROP DATABASE [GusarovVadim]
  16. GO
  17.  
  18. CREATE DATABASE [GusarovVadim]
  19. GO
  20.  
  21. USE [GusarovVadim]
  22. GO
  23.  
  24. IF object_id('GusarovVadim.Tariffs', 'U') IS NOT NULL
  25.     DROP TABLE  GusarovVadim.Tariffs
  26. GO
  27.  
  28. CREATE TABLE Tariffs (
  29.     name            VARCHAR(100),
  30.     mounthCost      FLOAT,
  31.     minutesCount    INT,
  32.     overflowCost    FLOAT,
  33.     CHECK (mounthCost >= 0 AND minutesCount >= 0 AND overflowCost >= 0 AND name != N'')
  34. )
  35. GO
  36.  
  37. INSERT INTO Tariffs(name, mounthCost, minutesCount, overflowCost) VALUES
  38.     (N'Без абонентской платы',0, 0, 3),
  39.     (N'Абонентский 50-минутный', 30, 50, 1),
  40.     (N'Безлимитный',50, 0, 0)
  41. GO
  42.  
  43. IF object_id( 'GusarovVadim.GetCost', 'F' ) IS NOT NULL  
  44.     DROP FUNCTION GusarovVadim.GetCost
  45. GO
  46.  
  47. CREATE FUNCTION GetCost(@nameOfTariff VARCHAR(100), @COUNT FLOAT)
  48. RETURNS FLOAT AS
  49. BEGIN
  50.     DECLARE @overflow FLOAT; DECLARE @tariffCost FLOAT; DECLARE @minuteCost FLOAT;
  51.     SELECT @overflow = minutesCount FROM Tariffs WHERE @nameOfTariff=name
  52.     SELECT @tariffCost = mounthCost FROM Tariffs WHERE @nameOfTariff=name
  53.     SELECT @minuteCost = overflowCost FROM Tariffs WHERE @nameOfTariff=name
  54.     IF (@COUNT < @overflow) RETURN @tariffCost
  55.     RETURN @tariffCost + (@COUNT - @overflow) * @minuteCost
  56. END
  57. GO
  58.  
  59. IF object_id( 'GusarovVadim.Median', 'F' ) IS NOT NULL  
  60.     DROP FUNCTION GusarovVadim.Median
  61. GO
  62.  
  63. CREATE FUNCTION Median(@name VARCHAR(100), @FIRST FLOAT, @SECOND FLOAT)
  64. RETURNS FLOAT AS
  65. BEGIN RETURN (dbo.GetCost(@name, @FIRST) + dbo.GetCost(@name, @SECOND)) / 2 END
  66. GO
  67.  
  68. IF object_id( 'GusarovVadim.GetTariff', 'F' ) IS NOT NULL  
  69.     DROP PROCEDURE GusarovVadim.GetTariff
  70. GO
  71.  
  72. CREATE PROCEDURE GetTariff(@minutes FLOAT)
  73. AS
  74.     DECLARE @nameOfTariff VARCHAR(100); DECLARE @MIN FLOAT;
  75.     SELECT @MIN = MIN(dbo.Median(name, 0, @minutes)) FROM Tariffs
  76.     SELECT @nameOfTariff = name FROM Tariffs WHERE @MIN = dbo.Median(name, 0, @minutes)
  77.     print(@nameOfTariff)
  78. GO
  79.  
  80. EXEC GetTariff 9
  81.  
  82. DECLARE @previous FLOAT = 0;
  83. DECLARE @CURRENT FLOAT = 0;
  84. DECLARE INTERVALСursor cursor FOR  
  85. SELECT DISTINCT round(b.minutesCount + a.mounthCost / b.overflowCost, 0)
  86. FROM Tariffs a, Tariffs b
  87. WHERE b.overflowCost != 0 AND round(b.minutesCount + a.mounthCost / b.overflowCost, 0) > 0
  88. ORDER BY round(b.minutesCount + a.mounthCost / b.overflowCost, 0);
  89.  
  90. OPEN INTERVALСursor
  91. fetch NEXT FROM INTERVALСursor  
  92. INTO @CURRENT
  93.  
  94. while @@fetch_status = 0  
  95. BEGIN
  96.     DECLARE @MIN FLOAT = 0; DECLARE @minName VARCHAR(100);
  97.     SELECT @MIN = MIN(dbo.Median(name, @previous, @CURRENT)) FROM Tariffs
  98.     SELECT @minName = name FROM Tariffs WHERE @MIN = dbo.Median(name, @previous, @CURRENT)
  99.     print(N'Интервал: '
  100.             + CONVERT(VARCHAR(100), @previous)
  101.             + ' -> '
  102.             +  CONVERT(VARCHAR(100), @CURRENT)
  103.             + ' - ' + @minName
  104.     )
  105.     SELECT @previous = @CURRENT;
  106.     fetch NEXT FROM INTERVALСursor  
  107.     INTO @CURRENT  
  108. END
  109.  
  110. close INTERVALСursor;  
  111. deallocate INTERVALСursor;
  112. GO
Advertisement
Add Comment
Please, Sign In to add comment