Oracle - 每个分析师SQL按周关闭的组呼叫

时间:2014-10-30 15:34:37

标签: sql oracle

我在SQL方面经验不足,但需要按周生成一些表格式分组结果。我已经建立了与我们的oracle数据库的ODBC连接,并希望为某些数据透视表提取这些数据。目前,我必须通过SupportWorks报告逐周手动提取这些数据,我想自动化它。

我无法添加一张图片来展示它应该是什么样子,但实际上是每位分析师在一年中的所有星期都会根据他们每周关闭的电话数量来划分一条线。

所以我想我想计算自今年年初以来每位分析师每周的电话数量,所以我有一张供我所有分析师使用的表格。

我认为实际上只有两个相关的领域,但我无法弄清楚如何按周计算整个事情,每位分析师需要额外的行数,同时我的KPI周是星期六到星期一。如果有一个系统定义周,我可以移动我的KPI日期以适应那个?

关闭(日期通话已关闭)

closedby(谁关闭了电话)

如果可能的话,我非常感谢你们的一些帮助。

我试图研究解决方案,但找不到能帮助我的东西。

以下是一些关注有问题调用的示例SQL。有些已被改为匿名。

  • 选择关闭,从opencall关闭
  • ((状态> 15 OR状态= 6)
  • and closedby in('analyst1','analyst2','analyst3','analyst4','analyst5','analyst6','analyst7')
  • AND trunc(to_date(substr(closedate,1,10),'DD-MM-YY'))'01 -OCT-14'和'31 -DEC-14'之间的对象
  • 按关闭顺序排列

我把它放在上面的列表中,因为这个窗口中的格式是1990年的。

因此,上面的代码将提取大约1300行的呼叫信息,然后我想要按周分列,而分析师的行则在那一周内关闭每个呼叫的数量。

我尝试使用评论者提供的代码示例执行此操作但仍然出错。

选择to_number(to_char(closedate,'IW'))作为“周数”

      ,closedby as "Closed by"

      ,count(closedate) as "Calls closed"

from  opencall

where   

((状态> 15 OR状态= 6)

and closedby in('analyst1','analyst2','analyst3','analyst4','analyst5','analyst6','analyst7')

AND trunc(to_date(substr(closedate,1,10),'DD-MM-YY'))'01 -OCT-14'和'31 -DEC-14'之间的对象

1 个答案:

答案 0 :(得分:0)

试试这个:

with closed_calls as
 (select to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')), 'IW')) as week_number
        ,closedby 
  from   opencall 
  where  ((status > 15 or status = 6)
  and    closedby in ('analyst1','analyst2','analyst3', 'analyst4','analyst5','analyst6','analyst7')
  and    trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')) between '01-OCT-14' and '31-DEC-14'))
select week_number as "Week number"
      ,closedby as "Closed by"
      ,count(closedby) as "Calls closed"
from   closed_calls
group by week_number
        ,closedby
order by week_number desc
        ,closedby asc;

日期存储为字符串,因此必须先将其转换为日期数据类型:

to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')

然后你可以截断它去除时间部分,然后提取周数。

如果您不介意转移KPI周,这应该很容易。您可以使用格式掩码将日期转换为周数。格式掩码将首先转换为varchar2字符串,因此您可以执行第二次转换为数字以进行排序。

to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')), 'WW'))

将从一年的第一天开始返回周数。

to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')), 'IW'))

将返回ISO标准周编号,该编号从一年的第一个星期一开始。

您的完整查询将如下所示:

select to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')), 'IW')) as "Week number"
      ,closedby as "Closed by"
      ,count(closeddate) as "Calls closed"
from   your_table
where  ...
group by to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')), 'IW'))
        ,closedby
编辑:我可能会过度思考KPI周。如果您的一周从星期日开始,我认为您应该能够通过简单地向您的封闭日期添加1天来获得您所需要的,即:

select to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')+1), 'IW')) as "Week number"
      ,closedby as "Closed by"
      ,count(closeddate) as "Calls closed"
from   your_table
where  ...
group by to_number(to_char(trunc(to_date(closedate, 'DD/MM/YYYY HH24:MI:SS')+1), 'IW'))
        ,closedby

在你接受我的话之前测试一下!

如果您仍然遇到转换错误,closedate中可能存在与格式掩码不匹配的狡猾值。这就是将日期存储为varchar2的问题,您错过了在数据进入数据库时​​验证数据的简单方法。