Advertisement
WorkAkkaunt

Северсталь По звонкам v2

Jul 23rd, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 10.52 KB | None | 0 0
  1. DECLARE @TASKS TABLE(Id uniqueidentifier)
  2.  
  3. INSERT INTO @TASKS
  4. SELECT id FROM oktell.dbo.A_TaskManager_Tasks
  5.  
  6. DECLARE @DATE_START datetime = '07-18-2019 00:00:00.001'
  7. DECLARE @DATE_END   datetime = '07-19-2019 23:59:59.000'
  8. DECLARE @TIME_START datetime = '01-01-1900 00:00:00.001'
  9. DECLARE @TIME_END   datetime = '01-01-1900 23:59:00.001'
  10.  
  11. DECLARE @INTERVAL INT = 3
  12.     /*select 1, 'По дням'
  13.     union all
  14.     select 2, 'По неделям'
  15.     union all
  16.     select 3, 'По месяцам'*/
  17. --------------------------------------------------------------------------------------------------------------------------
  18. DECLARE @Months TABLE(NUMBER INT, [Name] nvarchar(20))
  19. INSERT INTO @Months VALUES(1, 'Январь')
  20. INSERT INTO @Months VALUES(2, 'Февраль')
  21. INSERT INTO @Months VALUES(3, 'Март')
  22. INSERT INTO @Months VALUES(4, 'Апрель')
  23. INSERT INTO @Months VALUES(5, 'Май')
  24. INSERT INTO @Months VALUES(6, 'Июнь')
  25. INSERT INTO @Months VALUES(7, 'Июль')
  26. INSERT INTO @Months VALUES(8, 'Август')
  27. INSERT INTO @Months VALUES(9, 'Сентябрь')
  28. INSERT INTO @Months VALUES(10, 'Октябрь')
  29. INSERT INTO @Months VALUES(11, 'Ноябрь')
  30. INSERT INTO @Months VALUES(12, 'Декабрь')
  31.  
  32. --ФИЛЬТРУЕМ ПО ДАТЕ
  33. SELECT * INTO #Connections
  34. FROM [dbo].[A_Stat_Connections_1x1] as SC
  35. WHERE CAST(TimeStart AS TIME) BETWEEN CAST(@TIME_START AS TIME) AND CAST(@TIME_END AS TIME)
  36.     AND TimeStart BETWEEN @DATE_START AND @DATE_END
  37.  
  38. --ФИЛЬТРУЕМ ПО ТАСКАМ
  39. SELECT *
  40.     , (
  41.         SELECT TOP 1 ConnectionChainId FROM [oktell].[dbo].[A_TaskManager_Task_IncomingCalls] as TI
  42.         WHERE ConnectionChainId = IdChain AND EXISTS(SELECT * FROM @TASKS as T WHERE T.Id = TaskId)
  43.     ) as IdCh2
  44. INTO #Connections2
  45. FROM #Connections
  46.  
  47. DELETE FROM #Connections2 WHERE IdCh2 IS NULL
  48.  
  49. ------ИЗВЛЕКАЕМ ПО ОПЕРАТОРАМ
  50. SELECT * INTO #Filtered
  51. FROM #Connections2
  52. WHERE ConnectionType = 5
  53.  
  54. ------ИЗВЛЕКАЕМ ПО IVR
  55. SELECT * INTO #Filtered2
  56. FROM #Connections
  57. WHERE ConnectionType = 4
  58.  
  59. DROP TABLE #Connections2
  60. DROP TABLE #Connections
  61.  
  62. ----Считаем длительнсти звонков
  63. DECLARE @Calls TABLE (Id uniqueidentifier, IvrTime INT, OperTime INT, TalkTime INT, StartTime datetime)
  64.  
  65. INSERT INTO @Calls
  66. SELECT F1.IdChain
  67.     , DATEDIFF(SECOND, (SELECT DISTINCT TOP 1 TimeStart FROM #Filtered2 AS F2 WHERE F1.IdChain = F2.IdChain), F1.TimeAnswer)
  68.     , DATEDIFF(SECOND, F1.TimeStart, F1.TimeAnswer)
  69.     , DATEDIFF(SECOND, F1.TimeStart, F1.TimeStop)
  70.     , F1.TimeStart
  71. FROM #Filtered AS F1
  72.  
  73. DROP TABLE #Filtered
  74. DROP TABLE #Filtered2
  75. ---------------------------------------------------------
  76. --select * from @Calls
  77.  
  78. -----Извлекаем пропущенные звонки
  79. DECLARE @MissedCalls TABLE(Id uniqueidentifier, DateStart datetime)
  80.  
  81. INSERT INTO @MissedCalls
  82. SELECT IdChain, TimeStart
  83. FROM [dbo].[A_Stat_MissedCalls]
  84. WHERE TimeStart BETWEEN @DATE_START AND @DATE_END
  85.     AND DATEDIFF(SECOND, TimeStart, TimeStop) <= 10
  86.  
  87. -----разбиваем пропущенные по дням
  88. DECLARE @MissedByDay TABLE([COUNT] INT, [DAY] NCHAR(20))
  89.  
  90. INSERT INTO @MissedByDay
  91. SELECT COUNT(Id), CAST(DateStart AS DATE)
  92. FROM @MissedCalls
  93. --WHERE COUNT(Id) >= 10
  94. GROUP BY CAST(DateStart AS DATE)
  95. ----------------------------------------------
  96.  
  97.  
  98. ------РАЗБИВАЕМ ЗВОНКИ ПО ДНЯМ
  99. DECLARE @CallsByDay0 TABLE
  100.     (
  101.         [DAY] NCHAR(20), [COUNT] INT, MiddleCall FLOAT
  102.         , OperTimeMin INT, OperTimeMax INT, OperTimeMiddle FLOAT
  103.         , IvrTimeMiddle FLOAT, IvrTimeMax INT, IvrTimeMin INT
  104.         , SLA FLOAT
  105.     )
  106.  
  107. INSERT INTO @CallsByDay0
  108. SELECT CAST(StartTime AS DATE)
  109.     , COUNT(C.Id)
  110.     , AVG(TalkTime)
  111.     , MIN(OperTime)
  112.     , MAX(OperTime)
  113.     , IIF(SUM(IIF(OperTime - 10 > 0, 1, 0) ) != 0, SUM( IIF(OperTime - 10 > 0, OperTime - 10, 0)) / SUM(IIF(OperTime - 10 > 0, 1, 0) ), 0)
  114.     , AVG(IvrTime)
  115.     , MAX(IvrTime)
  116.     , MIN(IvrTime)
  117.     , ROUND((COUNT(C.Id) -  SUM( IIF(OperTime - 10 > 0, OperTime - 10, 0))) / CAST(COUNT(C.Id) AS FLOAT), 2)
  118. FROM @Calls AS C
  119. LEFT JOIN @MissedByDay AS MC
  120. ON CAST(C.StartTime AS DATE) = MC.[DAY]
  121. GROUP BY CAST(StartTime AS DATE)
  122.  
  123.  DECLARE @CallsByDay TABLE
  124.     (
  125.         [DAY] NCHAR(20), [COUNT] INT, MiddleCall FLOAT
  126.         , OperTimeMin INT, OperTimeMax INT, OperTimeMiddle FLOAT
  127.         , IvrTimeMiddle FLOAT, IvrTimeMax INT, IvrTimeMin INT
  128.         , SLA FLOAT, Missed INT
  129.     )
  130.  
  131. INSERT INTO @CallsByDay
  132. SELECT CD.[DAY]
  133.     , CD.[COUNT]
  134.     , MiddleCall
  135.     , OperTimeMin
  136.     , OperTimeMax
  137.     , OperTimeMiddle
  138.     , IvrTimeMiddle
  139.     , IvrTimeMax
  140.     , IvrTimeMin
  141.     , SLA
  142.     , ISNULL(MD.[COUNT], 0)
  143. FROM @CallsByDay0 AS CD
  144. LEFT JOIN @MissedByDay AS MD
  145. ON CD.[DAY] = MD.[DAY]
  146.  
  147. DELETE @CallsByDay0
  148. DELETE @MissedCalls
  149. -----------------------------------------------------------------------------------------------------------
  150.  
  151. IF (@INTERVAL = 1)
  152. BEGIN
  153.    SELECT [DAY] AS 'День'
  154.         , [COUNT] AS 'Всего звонков'
  155.         , MiddleCall AS 'Средняя длительность звонка'
  156.         , OperTimeMin AS 'Время до ответа оператора min'
  157.         , OperTimeMax AS 'Время до ответа оператора max'
  158.         , OperTimeMiddle AS 'Среднее время до ответа оператора'
  159.         , IvrTimeMiddle AS 'Время в IVR среднее'
  160.         , IvrTimeMax AS 'Время в IVR MAX'
  161.         , IvrTimeMin AS 'Время в IVR MIN'
  162.         , CAST(SLA * 100 AS nvarchar) + '%' AS 'SLA'
  163.         , Missed AS 'Пропущено'
  164.    FROM @CallsByDay
  165. END
  166.  
  167. ---Разбитие по неделям------------------------------------------------------------------------------
  168. IF (@INTERVAL = 2)
  169. BEGIN
  170.     DECLARE @MissedByWeek TABLE([COUNT] INT, [Week] NCHAR(20))
  171.     INSERT INTO @MissedByWeek
  172.     SELECT SUM([COUNT])
  173.         , CAST(DATEPART(DAY, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY]) - 1) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  174.             + 'd'
  175.             + '-'
  176.             + CAST(DATEPART(MONTH, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY]) - 1) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  177.             + 'm'
  178.             + ':::'
  179.             + CAST(DATEPART(DAY, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY])) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  180.             + 'd'
  181.             + '-'
  182.             + CAST(DATEPART(MONTH, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY])) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  183.             + 'm'
  184.     FROM @MissedByDay
  185.     GROUP BY DATEPART(WEEK, [DAY])
  186.  
  187.     DECLARE @CallsByWeek TABLE
  188.         (
  189.             [Week] NCHAR(20), [COUNT] INT, MiddleCall FLOAT
  190.             , OperTimeMin INT, OperTimeMax INT, OperTimeMiddle FLOAT
  191.             , IvrTimeMiddle FLOAT, IvrTimeMax INT, IvrTimeMin INT
  192.             , SLA FLOAT
  193.         )
  194.    
  195.     INSERT INTO @CallsByWeek
  196.     SELECT CAST(DATEPART(DAY, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY]) - 1) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  197.             + 'd'
  198.             + '-'
  199.             + CAST(DATEPART(MONTH, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY]) - 1) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  200.             + 'm'
  201.             + ':::'
  202.             + CAST(DATEPART(DAY, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY])) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  203.             + 'd'
  204.             + '-'
  205.             + CAST(DATEPART(MONTH, CAST(DATEADD(DAY, (DATEPART(WEEK, [DAY])) * 7, '01-01-1900 00:00:00.001') AS DATE)) AS nvarchar)
  206.             + 'm'
  207.         , SUM([COUNT])
  208.         , ROUND(AVG(MiddleCall), 2)
  209.         , MIN(OperTimeMin)
  210.         , MAX(OperTimeMax)
  211.         , ROUND(AVG(OperTimeMiddle), 2)
  212.         , ROUND(AVG(IvrTimeMiddle), 2)
  213.         , MAX(IvrTimeMax)
  214.         , MIN(IvrTimeMin)
  215.         , ROUND(AVG(SLA), 2)
  216.     FROM @CallsByDay
  217.     GROUP BY DATEPART(WEEK, [DAY])
  218.  
  219.     SELECT CW.[Week] AS 'Неделя'
  220.         , CW.[COUNT] AS 'Всего звонков'
  221.         , MiddleCall AS 'Средняя длительность звонка'
  222.         , OperTimeMin AS 'Время до ответа оператора min'
  223.         , OperTimeMax AS 'Время до ответа оператора max'
  224.         , OperTimeMiddle AS 'Среднее время до ответа оператора'
  225.         , IvrTimeMiddle AS 'Время в IVR среднее'
  226.         , IvrTimeMax AS 'Время в IVR MAX'
  227.         , IvrTimeMin AS 'Время в IVR MIN'
  228.         , CAST(SLA * 100 AS nvarchar) + '%' AS 'SLA'
  229.         , ISNULL(MW.[COUNT], 0) AS 'Пропущено'
  230.     FROM @CallsByWeek   AS CW
  231.     LEFT JOIN @MissedByWeek  AS MW
  232.     ON CW.[Week] = MW.[Week]
  233. END
  234.  
  235. ----Разбитие по месяцам-----------------------------------------------------------------
  236. IF(@INTERVAL = 3)
  237. BEGIN
  238.     DECLARE @MissedByMonth TABLE([COUNT] INT, [MONTH] NCHAR(20))
  239.     INSERT INTO @MissedByMonth
  240.     SELECT SUM([COUNT])
  241.         , DATEPART(MONTH, [DAY])
  242.     FROM @MissedByDay
  243.     GROUP BY DATEPART(MONTH, [DAY])
  244.  
  245.     DECLARE @CallsByMonth TABLE
  246.         (
  247.             [MONTH] NCHAR(20), [COUNT] INT, MiddleCall FLOAT
  248.             , OperTimeMin INT, OperTimeMax INT, OperTimeMiddle FLOAT
  249.             , IvrTimeMiddle FLOAT, IvrTimeMax INT, IvrTimeMin INT
  250.             , SLA FLOAT
  251.         )
  252.    
  253.     INSERT INTO @CallsByMonth
  254.     SELECT DATEPART(MONTH, [DAY])
  255.         , SUM([COUNT])
  256.         , ROUND(AVG(MiddleCall), 2)
  257.         , MIN(OperTimeMin)
  258.         , MAX(OperTimeMax)
  259.         , ROUND(AVG(OperTimeMiddle), 2)
  260.         , ROUND(AVG(IvrTimeMiddle), 2)
  261.         , MAX(IvrTimeMax)
  262.         , MIN(IvrTimeMin)
  263.         , ROUND(AVG(SLA), 2)
  264.     FROM @CallsByDay
  265.     GROUP BY DATEPART(MONTH, [DAY])
  266.  
  267.     SELECT M.[Name] AS 'Месяц'
  268.         , CM.[COUNT] AS 'Всего звонков'
  269.         , MiddleCall AS 'Средняя длительность звонка'
  270.         , OperTimeMin AS 'Время до ответа оператора min'
  271.         , OperTimeMax AS 'Время до ответа оператора max'
  272.         , OperTimeMiddle AS 'Среднее время до ответа оператора'
  273.         , IvrTimeMiddle AS 'Время в IVR среднее'
  274.         , IvrTimeMax AS 'Время в IVR MAX'
  275.         , IvrTimeMin AS 'Время в IVR MIN'
  276.         , CAST(SLA * 100 AS nvarchar) + '%' AS 'SLA'
  277.         , ISNULL(MM.[COUNT], 0) AS 'Пропущено'
  278.     FROM @CallsByMonth AS CM
  279.     LEFT JOIN @MissedByMonth AS MM
  280.     ON CM.[MONTH] = MM.[MONTH]
  281.     LEFT JOIN @Months AS M
  282.     ON CM.[MONTH] = M.[NUMBER]
  283. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement