【问题标题】:Calculating the prorata of employee calls per Business Unit in SQL Server 2014在 SQL Server 2014 中计算每个业务部门的员工呼叫比例
【发布时间】:2017-08-18 12:42:00
【问题描述】:

我正在制定业务规则,以确定每 30 分钟间隔活跃的呼叫中心代理的数量。

我们有两种类型的代理:计费技术运营

我们最近让计费代理接听技术电话,反之亦然。

我编写了以下代码,它返回每个代理、每个间隔和每个呼叫类型的呼叫计数:

SELECT 
    HAGENT.[ROW_DATE],
    CASE 
       WHEN LEN([STARTTIME]) = 1 THEN '00:00'
       WHEN LEN([STARTTIME]) = 2 THEN '00:30'
       WHEN LEN([STARTTIME]) = 3 THEN (LEFT([STARTTIME],1) + ':' + RIGHT([STARTTIME],2))
       WHEN LEN([STARTTIME]) = 4 THEN (LEFT([STARTTIME],2) + ':' + RIGHT([STARTTIME],2)) 
    END AS THETIME,
    ([LOGID]) AS AGENTS,
    COUNT(HAGENT.ACDCALLS) AS CALL_COUNT,
    CASE 
       WHEN SPLITMATRIX.[Business_Unit] LIKE '%Billing%' THEN 'CDN Billing'
       WHEN SPLITMATRIX.[Business_Unit] LIKE '%TechOps%' THEN 'CDN Tech Ops' 
    END AS Bunit
FROM 
    [KPI_DATA].[dbo].[DM_CMS_HAGENT] HAGENT
LEFT JOIN 
    [GEMDB].[dbo].[T_PRD_REF_xAGENT_AGENTLIST] AGENTLIST 
        ON AGENTLIST.asp_raw_cmsID1 = HAGENT.LOGID  COLLATE DATABASE_DEFAULT 
        AND HAGENT.ROW_DATE BETWEEN AGENTLIST.[asp_raw_START_SDEPT] AND AGENTLIST.asp_raw_STOP_SDEPT
        AND HAGENT.ROW_DATE BETWEEN AGENTLIST.[asp_raw_START_TEAM] AND AGENTLIST.[asp_raw_STOP_TEAM]
LEFT JOIN 
    [MATRIX_DATA].[dbo].[REF_CMS_SPLIT_MATRIX] SPLITMATRIX
        ON SPLITMATRIX.SPLIT = HAGENT.SPLIT
WHERE
    ROW_DATE >= '2017-07-01' 
    AND [ACDCALLS] != 0 
    AND (SPLITMATRIX.[Business_Unit] LIKE '%Billing%' 
         OR SPLITMATRIX.[Business_Unit] LIKE '%TechOps%')
GROUP BY 
    GROUPING SETS (
         (ROW_DATE, STARTTIME,([LOGID]), SPLITMATRIX.[Business_Unit]),
         (ROW_DATE, STARTTIME,([LOGID]))
    )
ORDER BY 
    ROW_DATE DESC, THETIME DESC, [LOGID] DESC

输出如下所示:

SQL Output

由于 AGENTS 是代理的唯一 logid,Bunit 是所接电话的类型(当 Bunit 为 NULL 时,它是该时间间隔内代理所接电话的总数)。

从这个输出中,我想计算每个间隔和呼叫类型的活跃员工数。

例如,如果代理接听了 2 个计费电话和 1 个技术运营电话,我会认为该代理的 2/3 是计费代理,而该代理的 1/3 是技术运营代理。

最后,我想对每个呼叫类型、每个间隔的座席比率的总和进行分组。

我尝试使用 PIVOT 函数,但没有成功。

我的预期结果是这样的:

https://i.stack.imgur.com/oKiUl.jpg

有什么帮助吗?

【问题讨论】:

  • 你能告诉我们你的预期结果吗?
  • 嗨,我的预期结果是这样的:i.stack.imgur.com/oKiUl.jpg 这基本上是我们的活跃代理根据他们接听的呼叫类型的数量而按比例分配的。
  • 一些样本数据怎么样?

标签: sql sql-server


【解决方案1】:

您可以在这种情况下使用 PIVOT 和 UNPIVOT

样本数据

CREATE TABLE t_bu
(row_date DATE,
 thetime TIME,
 agents INT,
 call_count INT,
 bunit VARCHAR(20)
)

INSERT INTO t_bu VALUES
('8/17/2017','9:30',1210893,1,'CDN Billing'),
('8/17/2017','9:30',1210893,1,NULL),
('8/17/2017','9:30',1210870,2,'CDN Tech Ops'),
('8/17/2017','9:30',1210870,2,NULL),
('8/17/2017','9:30',1210858,3,'CDN Billing'),
('8/17/2017','9:30',1210858,3,NULL),
('8/17/2017','9:30',1210857,1,'CDN Tech Ops'),
('8/17/2017','9:30',1210857,1,NULL),
('8/17/2017','9:30',1210849,1,'CDN Billing'),
('8/17/2017','9:30',1210849,1,NULL),
('8/17/2017','9:30',1210832,2,'CDN Billing'),
('8/17/2017','9:30',1210832,1,'CDN Tech Ops'),
('8/17/2017','9:30',1210832,3,NULL),
('10/21/2017','10:30',1210857,3,'CDN Tech Ops'),
('10/21/2017','10:30',1210857,3,NULL),
('10/21/2017','12:30',1210857,3,'CDN Tech Ops'),
('10/21/2017','12:30',1210857,3,NULL),
('10/21/2017','12:30',1210849,4,'CDN Billing'),
('10/21/2017','12:30',1210849,4,NULL),
('10/21/2017','12:30',1210832,3,'CDN Billing'),
('10/21/2017','12:30',1210832,5,'CDN Tech Ops'),
('10/21/2017','12:30',1210832,8,NULL);

SQL 查询(动态)

DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CASE WHEN t.bunit IS NULL THEN 'Total' ELSE t.bunit END) 
                     FROM t_bu t -- use your table name
                      FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @query = 'WITH t_comp AS
              (SELECT row_date, thetime, SUM(CAST([CDN Billing] AS FLOAT)/CAST([Total] AS FLOAT)) [CDN Billing], SUM(CAST([CDN Tech Ops] AS FLOAT)/CAST([Total] AS FLOAT)) [CDN Tech Ops]
                 FROM (SELECT agents, row_date, thetime, ' + @cols + 
             '           FROM (SELECT agents, 
                                      row_date,
                                      thetime,
                                      CASE WHEN bunit IS NULL THEN ''Total'' ELSE bunit END AS bunit,
                                      call_count
                                 FROM t_bu -- use your table name
                              ) x
                        PIVOT (MAX(call_count)
                          FOR bunit in (' + @cols + ')) p 
                      ) a
                GROUP BY row_date, thetime
               )
               SELECT row_date, thetime, call_type, active_agents
                 FROM t_comp
               UNPIVOT (active_agents
                   FOR call_type IN ([CDN Billing], [CDN Tech Ops])) u'

EXECUTE(@query)
 GO

结果

row_date    thetime             call_type       active_agents
2017-08-17  09:30:00.0000000    CDN Billing     3.66666666666667
2017-08-17  09:30:00.0000000    CDN Tech Ops    2.33333333333333
2017-10-21  10:30:00.0000000    CDN Tech Ops    1
2017-10-21  12:30:00.0000000    CDN Billing     1.375
2017-10-21  12:30:00.0000000    CDN Tech Ops    1.625

【讨论】:

  • 这是基于您提供的 SQL 输出,因为我们没有您的示例原始数据(来自您在 SQL 上使用的原始表)。我认为,如果我们使用这些数据来获得所需的结果,效率会更高。
  • 谢谢费迪南德。到目前为止,这似乎工作正常。非常感谢!
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
相关资源
最近更新 更多