Advertisement
WorkAkkaunt

Отчет по времени звонков

Jun 27th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 12.97 KB | None | 0 0
  1. /****** Скрипт для команды SelectTopNRows из среды SSMS  ******/
  2. --Переменные для фильтра
  3. DECLARE @OPERATOR uniqueidentifier
  4. DECLARE @TASK uniqueidentifier
  5. DECLARE @DATE datetime
  6. DECLARE @TIME_START datetime
  7. DECLARE @TIME_END datetime
  8.  
  9. --SET @OPERATOR = 'D1F85F26-C9DF-4A32-8287-8A34EA3FC02B'
  10. --SET @TASK = '2257D551-2245-47B0-8D3B-BDB1919A84BD'
  11. --SET @DATE = '2019-01-01 00:00:00.000'
  12.  
  13. SET @OPERATOR = '23BDA663-D080-4D57-ADAD-9CD894068E89'
  14. SET @TASK = 'E49E7F5C-2ACD-4869-90B2-6CE4E9291DE9'
  15. SET @DATE = '2019-06-22 00:00:00.000'
  16.  
  17. SET @TIME_START = '1900-01-01 01:00:00.000'
  18. SET @TIME_END = '1900-01-01 20:00:00.000'
  19.  
  20. DECLARE @FilteredTable TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime)
  21. DECLARE @FilteredTable3 TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime)
  22. DECLARE @FilteredTable2 TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime, Number int)
  23. DECLARE @SecondTable TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime, Interval nvarchar(20), Number int)
  24. DECLARE @SecondTable2 TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime, Interval nvarchar(20), Number int)
  25. DECLARE @Intervals_And_Length TABLE(IdTask uniqueidentifier, IdOperator uniqueidentifier, [State] int, DateStart datetime, TimeStart datetime, DateTimeStop datetime, Interval nvarchar(20), LenTime float)
  26.  
  27. DECLARE @StartTable TABLE(IdOperator uniqueidentifier, DateStart datetime, TimeStart datetime, Task nvarchar(200), Operator nvarchar(200), [State] int, Date datetime, Interval nvarchar(20), LenTime float)
  28.  
  29. DECLARE @TimeIntervals TABLE(Interval nvarchar(20), TimeStart time, TimeEnd time)
  30.  
  31. DECLARE @TestTable TABLE(Interval nvarchar(20))
  32.  
  33. --отфильтровать таблицу
  34. INSERT INTO @FilteredTable
  35. SELECT IdTask
  36.     ,IdOperator
  37.     ,[State]
  38.     ,DateStart
  39.     ,TimeStart
  40.     ,DateTimeStop
  41. FROM [oktell_cc_temp].[dbo].[A_Cube_CC_OperatorStates] with (nolock)
  42. WHERE IdOperator = @OPERATOR AND DateStart = @DATE AND CAST(DateTimeStop as date) = @DATE
  43.     AND TimeStart >= @TIME_START AND CAST(DateTimeStop as time) <= CAST(@TIME_END as time)
  44.  
  45. INSERT INTO @FilteredTable3
  46. SELECT *
  47. FROM @FilteredTable
  48. WHERE IdTask = @TASK OR [State] = 10 OR [State] = 9
  49.  
  50. --пронумеровать колонки
  51. INSERT INTO @FilteredTable2
  52. SELECT *
  53.     , row_number() over(ORDER BY [@FilteredTable3].DateStart) as Number
  54. FROM @FilteredTable3
  55.  
  56. DECLARE @Count int
  57. SELECT @Count = COUNT(*) from @FilteredTable2
  58.  
  59. DECLARE @Iterator int
  60. DECLARE @IdTask uniqueidentifier
  61. DECLARE @IdOperator uniqueidentifier
  62. DECLARE @State int
  63. DECLARE @DateStart datetime
  64. DECLARE @TimeStart datetime
  65. DECLARE @DateTimeStop datetime
  66.  
  67. SET @Iterator = 1
  68.  
  69. --применяем функцию для каждой строки таблицы, которая вставляет интервалы
  70. WHILE @Iterator <= @Count
  71.     BEGIN
  72.         SELECT
  73.             @IdTask = IdTask
  74.             ,@IdOperator = IdOperator
  75.             ,@State = [State]
  76.             ,@DateStart = DateStart
  77.             ,@TimeStart = TimeStart
  78.             ,@DateTimeStop = DateTimeStop
  79.         FROM @FilteredTable2
  80.         WHERE Number = @Iterator
  81.  
  82.         INSERT INTO @SecondTable SELECT *,0 FROM [oktell_cc_temp].[dbo].[AddTimeIntervals] (
  83.             @IdTask
  84.             ,@IdOperator
  85.             ,@State
  86.             ,@DateStart
  87.             ,@TimeStart
  88.             ,@DateTimeStop
  89.         )
  90.  
  91.         SET @Iterator = @Iterator + 1
  92.     END;
  93.  
  94. INSERT INTO @SecondTable2
  95. SELECT
  96.     IdTask
  97.     ,IdOperator
  98.     ,[State]
  99.     ,DateStart
  100.     ,TimeStart
  101.     ,DateTimeStop
  102.     ,Interval
  103.     ,row_number() over(ORDER BY [@SecondTable].DateStart) as Number
  104. FROM @SecondTable
  105.  
  106. SET @Iterator = 1
  107. DECLARE @Interval nvarchar(20)
  108.  
  109. WHILE @Iterator <= @Count
  110.     BEGIN
  111.         SELECT
  112.             @IdTask = IdTask
  113.             ,@IdOperator = IdOperator
  114.             ,@State = [State]
  115.             ,@DateStart = DateStart
  116.             ,@TimeStart = TimeStart
  117.             ,@DateTimeStop = DateTimeStop
  118.             ,@Interval = Interval
  119.         FROM @SecondTable2
  120.         WHERE Number = @Iterator
  121.  
  122.         INSERT INTO @Intervals_And_Length SELECT * FROM [oktell_cc_temp].[dbo].[SetLenForTimeIntervals] (
  123.             @IdTask
  124.             ,@IdOperator
  125.             ,@State
  126.             ,@DateStart
  127.             ,@TimeStart
  128.             ,@DateTimeStop
  129.             ,@Interval
  130.         )
  131.  
  132.         SET @Iterator = @Iterator + 1
  133.     END;
  134.  
  135. --заполняем StartTable нужными значениями и интервалами и работаем уже с ней
  136. INSERT INTO @StartTable
  137. SELECT IdOperator, DateStart, TimeStart
  138.     ,[oktell_cc_temp].[dbo].[A_Cube_CC_Cat_Task].[Name] AS Task
  139.     ,[oktell_cc_temp].[dbo].[A_Cube_CC_Cat_OperatorInfo].[Name] AS Operator
  140.     ,[State]
  141.     ,DateStart
  142.     ,Interval
  143.     ,LenTime
  144. FROM @Intervals_And_Length
  145. LEFT JOIN
  146. [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_Task]
  147.     ON [@Intervals_And_Length].IdTask = [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_Task].Id
  148. LEFT JOIN
  149. [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_OperatorInfo]
  150.     ON [@Intervals_And_Length].IdOperator = [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_OperatorInfo].Id
  151.  
  152. DECLARE @TimeTable TABLE
  153.     (
  154.         IdOperator uniqueidentifier, DateStart datetime, TimeStart datetime,
  155.         Task nvarchar(200), Operator nvarchar(200), [State] int, Date datetime, Interval nvarchar(20), LenTime float,
  156.         Time_PostProcessing float, Time_Talking float, Time_Ready float, Time_Break float
  157.     )
  158.  
  159. INSERT INTO @TimeTable
  160. SELECT *
  161.     ,IIF([State] = 7, LenTime / 60, 0)
  162.     ,IIF([State] = 4 OR [State] = 5 OR [State] = 6 OR [State] = 8, LenTime / 60, 0)
  163.     ,IIF([State] = 10, LenTime / 60, 0)
  164.     ,IIF([State] = 9, LenTime / 60, 0)
  165. FROM @StartTable
  166.  
  167. DECLARE @TimeTableICode TABLE
  168.     (
  169.         IdOperator uniqueidentifier, DateStart datetime, TimeStart datetime,
  170.         Task nvarchar(200), Operator nvarchar(200), [State] int, Date datetime, Interval nvarchar(20), LenTime float,
  171.         Time_PostProcessing float, Time_Talking float, Time_Ready float, Time_Break float, ICode int
  172.     )
  173.  
  174. DECLARE @ICodes TABLE(OperatorId uniqueidentifier, TimeChange time, ICode int)
  175.  
  176. INSERT INTO @ICodes
  177. SELECT UserId
  178.     ,TimeChange
  179.     ,ICode
  180. FROM [oktell].[dbo].[A_UserStateHistory]
  181. WHERE UserId = @OPERATOR AND CAST(TimeChange as date) = @DATE AND ICode != -1
  182.         AND CAST(TimeChange as time) >= CAST(@TIME_START as time) AND CAST(TimeChange as time) <= CAST(@TIME_END as time)
  183.  
  184. --select * from @ICodes
  185.  
  186. INSERT INTO @TimeTableICode
  187. SELECT *
  188.     ,(
  189.         SELECT ICode FROM @ICodes
  190.         WHERE (ROUND(CAST(TimeStart as float), 2) = ROUND(CAST(CAST(CAST(TimeChange as time) as datetime) as float), 2))
  191.     ) as ICode
  192. FROM @TimeTable
  193.  
  194. DECLARE @TimeTableBreaks TABLE
  195.     (
  196.         IdOperator uniqueidentifier, DateStart datetime, TimeStart datetime,
  197.         Task nvarchar(200), Operator nvarchar(200), [State] int, Date datetime, Interval nvarchar(20), LenTime float,
  198.         Time_PostProcessing float, Time_Talking float, Time_Ready float, Time_Break float, ICode int,
  199.         Time_Break_CallBack float, Time_Break_Activation float, Time_Break_Training float, Time_Break_Plan float
  200.     )
  201.  
  202. INSERT INTO @TimeTableBreaks
  203. SELECT *
  204.     , IIF(ICode = 7778, LenTime / 60, 0)
  205.     , IIF(ICode = 7775, LenTime / 60, 0)
  206.     , IIF(ICode = 7776, LenTime / 60, 0)
  207.     , IIF(ICode = 7774, LenTime / 60, 0)
  208. FROM @TimeTableICode
  209.  
  210. DECLARE @GroupedTable TABLE
  211.     (
  212.         Interval nvarchar(20),
  213.         Time_PostProcessing float, Time_Talking float, Time_Ready float,
  214.         Time_Break_CallBack float, Time_Break_Activation float, Time_Break_Training float, Time_Break_Plan float
  215.     )
  216.  
  217. INSERT INTO @GroupedTable
  218. SELECT Interval
  219.     ,ROUND(SUM(Time_PostProcessing), 2)
  220.     ,ROUND(SUM(Time_Talking), 2)
  221.     ,ROUND(SUM(Time_Ready), 2)
  222.     ,ROUND(SUM(Time_Break_CallBack), 2)
  223.     ,ROUND(SUM(Time_Break_Activation), 2)
  224.     ,ROUND(SUM(Time_Break_Training), 2)
  225.     ,ROUND(SUM(Time_Break_Plan), 2)
  226. FROM @TimeTableBreaks
  227. GROUP BY Interval
  228.  
  229. DECLARE @FinalTable TABLE
  230.     (
  231.         Interval nvarchar(20),
  232.         Time_PostProcessing float, Time_Talking float, Time_Ready float,
  233.         Time_Break_CallBack float, Time_Break_Activation float, Time_Break_Training float, Time_Break_Plan float,
  234.         Occupancy nchar(10), UtilizationStandart nchar(10), Utilization nchar(10)
  235.     )
  236.  
  237. INSERT INTO @FinalTable
  238. SELECT Interval
  239.     ,ROUND(Time_PostProcessing, 2)
  240.     ,ROUND(Time_Talking, 2)
  241.     ,ROUND(Time_Ready, 2)
  242.     ,ROUND(Time_Break_CallBack, 2)
  243.     ,ROUND(Time_Break_Activation, 2)
  244.     ,ROUND(Time_Break_Training, 2)
  245.     ,ROUND(Time_Break_Plan, 2)
  246.     ,IIF
  247.     (
  248.         Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation != 0
  249.         ,CONCAT(ROUND(((Time_PostProcessing + Time_Talking + Time_Break_CallBack + Time_Break_Activation)
  250.             / (Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation)) * 100, 2), '%')
  251.         ,'0'
  252.     )
  253.     ,IIF
  254.     (
  255.         Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation + Time_Break_Training + Time_Break_Plan != 0
  256.         ,CONCAT(ROUND(((Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation + Time_Break_Training)
  257.             / (Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation + Time_Break_Training + Time_Break_Plan)) * 100, 2), '%')
  258.         ,'0'
  259.     )
  260.     ,IIF
  261.     (
  262.         Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation + Time_Break_Training + Time_Break_Plan != 0
  263.         ,CONCAT(ROUND(((Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation)
  264.             / (Time_PostProcessing + Time_Talking + Time_Ready + Time_Break_CallBack + Time_Break_Activation + Time_Break_Training + Time_Break_Plan)) * 100, 2), '%')
  265.         ,'0'
  266.     )
  267. FROM @GroupedTable
  268.  
  269. DECLARE  @sum_Time_PostProcessing float
  270. DECLARE  @sum_Time_Talking float
  271. DECLARE  @sum_Time_Ready float
  272. DECLARE  @sum_Time_Break_CallBack float
  273. DECLARE  @sum_Time_Break_Activation float
  274. DECLARE  @sum_Time_Break_Training float
  275. DECLARE  @sum_Time_Break_Plan float
  276.  
  277. DECLARE @Occupation float
  278. DECLARE @UtilizationStandart float
  279. DECLARE @Utilization float
  280.  
  281. SET @sum_Time_PostProcessing = (SELECT SUM(Time_PostProcessing) FROM @FinalTable)
  282. SET @sum_Time_Talking = (SELECT SUM(Time_Talking) FROM @FinalTable)
  283. SET @sum_Time_Ready = (SELECT SUM(Time_Ready) FROM @FinalTable)
  284. SET @sum_Time_Break_CallBack = (SELECT SUM(Time_Break_CallBack) FROM @FinalTable)
  285. SET @sum_Time_Break_Activation = (SELECT SUM(Time_Break_Activation) FROM @FinalTable)
  286. SET @sum_Time_Break_Training = (SELECT SUM(Time_Break_Training) FROM @FinalTable)
  287. SET @sum_Time_Break_Plan = (SELECT SUM(Time_Break_Plan) FROM @FinalTable)
  288.  
  289. SET @Occupation = IIF
  290.     (
  291.         @sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation != 0
  292.         ,(@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Break_CallBack + @sum_Time_Break_Activation)
  293.             / (@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation) * 100
  294.         ,0
  295.     )
  296. SET @UtilizationStandart = IIF
  297.     (
  298.         @sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation + @sum_Time_Break_Training + @sum_Time_Break_Plan != 0
  299.         ,(@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation + @sum_Time_Break_Training)
  300.             / (@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation + @sum_Time_Break_Training + @sum_Time_Break_Plan) * 100
  301.         ,0
  302.     )
  303. SET @Utilization = IIF
  304.     (
  305.         @sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation + @sum_Time_Break_Training + @sum_Time_Break_Plan != 0
  306.         ,((@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation)
  307.             / (@sum_Time_PostProcessing + @sum_Time_Talking + @sum_Time_Ready + @sum_Time_Break_CallBack + @sum_Time_Break_Activation + @sum_Time_Break_Training + @sum_Time_Break_Plan)) * 100
  308.         ,0
  309.     )
  310.  
  311. INSERT INTO @FinalTable
  312. VALUES
  313. (
  314.   'Итого'
  315.   ,@sum_Time_PostProcessing
  316.   ,@sum_Time_Talking
  317.   ,@sum_Time_Ready
  318.   ,@sum_Time_Break_CallBack
  319.   ,@sum_Time_Break_Activation
  320.   ,@sum_Time_Break_Training
  321.   ,@sum_Time_Break_Plan
  322.   ,CONCAT(ROUND(@Occupation, 2), '%')
  323.   ,CONCAT(ROUND(@UtilizationStandart, 2), '%')
  324.   ,CONCAT(ROUND(@Utilization, 2), '%')
  325. )
  326.  
  327. select * from @FinalTable
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement