2016-09-17 145 views
4

我有显示客户呼叫的数据。我有客户号码,电话号码(1个客户可以有多个),每个语音呼叫的日期记录和呼叫持续时间的列。表看起来像下面的例子。SQL计数/总计直到另一列中的特定日期的呼叫数

CusID | PhoneNum | Date    | Duration 
20111 43576233 20.01.2016-14:00  00:10:12 
20111 44498228 14.01.2016-15:30  00:05:12 
20112 43898983 14.01.2016-15:30  

我想要的是统计每个号码的呼叫尝试次数,然后回答(持续时间> 0)。这样我就可以估计我平均需要多少次打电话才能联系客户或电话号码。它应该基本上统计每个电话号码在min(Date)之前的任何列,其中持续时间> 0。

SELECT Phone, Min(Date) FROM XX WHERE Duration IS NOT NULL GROUP BY Phone -- 

我想这应该给我的时间限制,直到我应该计算的电话数量。我无法弄清楚如何完成任务

编辑 - 其余部分,我会添加一个例子

enter image description here

而结果只能算第5行,因为它是客户之前的电话是第一次达到。所以导致表应该是这样的:

enter image description here

+0

您希望每天处理多个(成功)通话? – Gerfried

+0

我对succesfull调用不感兴趣。我试图找出多少次不成功的呼叫,直到第一次成功拨打每部电话。 – Zeir

回答

3

第一步是有效的:

SELECT 
     CusID 
     ,PhoneNum 
     ,MIN(Date) AS MinDate 
    FROM XX 
    WHERE Duration IS NOT NULL 
    GROUP BY CusID, PhoneNum 

这给你每PhoneNum一行与第一次成功呼叫的日期。

现在将其加入到原始表中,并仅保留具有先前日期的行(根据PhoneNum)。再按PhoneNum分组并计数。加入应该是LEFT JOIN对于在第一次尝试时应答的数字具有零计数行。

WITH 
CTE 
AS 
(
    SELECT 
     CusID 
     ,PhoneNum 
     ,MIN(Date) AS MinDate 
    FROM XX 
    WHERE Duration IS NOT NULL 
    GROUP BY CusID, PhoneNum 
) 
SELECT 
    CusID 
    ,PhoneNum 
    ,COUNT(XX.PhoneNum) AS Count 
FROM 
    CTE 
    LEFT JOIN XX 
     ON XX.PhoneNum = CTE.PhoneNum 
     AND XX.Date < CTE.MinDate 
GROUP BY CusID, PhoneNum 
; 

如果一个数字从未被回答过,它根本不会被包含在结果集中。

+0

该代码完成工作 – Zeir

0

在SQL Server 2012+,可以使用以下逻辑:

  • 指定的“悬而未决”的个数调用数据的每一行。这使用带窗口函数的条件聚合。
  • 然后,为每个用户调用回答的最大计数。
  • 计算应答呼叫的数量。
  • 该比率是平均值。
  • 这忽略了未接电话的未接电话串。

结果查询:

select phone, max(cume_unanswered), count(*) as num_answered, 
     max(cume_unanswered) * 1.0/count(*) as ratio 
from (select t.*, 
      sum(case when duration is null then 1 else 0 end) over (partition by phone order by date) as cume_unanswered 
     from t 
    ) t 
where duration is not null 
group by phone; 
+0

如果我把它弄错了,我认为这段代码会给我提供未接来电与已接来电的比率。我想要的是在第一次接听电话之前找到未接电话。我对第一次接听电话后没有接听或回答的电话不感兴趣。我在第一个问题中添加了一些excel表格,以便更清晰 – Zeir

+0

@Zeir。 。 。这是在每个*应答呼叫电话号码之前统计未应答呼叫的数量。这似乎是你想要的。如果电话只有一个应答的电话,那么这两个措施是相同的。 –

+1

我试图在第一次接听电话之前找到未接电话的数量。不是每个人。您可以在我的问题上查看电话号码118的结果。 – Zeir

1

请尝试此查询:

SELECT phonecalls.CusID, COUNT(0) AS failedcalls, phonenumber, success.firstsuccess FROM phonecalls, 
(SELECT min(Date) AS firstsuccess, CusID, phonenumber FROM phonecalls WHERE Duration IS NOT NULL GROUP BY CusID, phonenumber) success 
WHERE phonecalls.CusID = success.CusID AND phonecalls.phonenumber = success.phonenumber AND phonecalls.Date < success.firstsuccess 
GROUP BY phonecalls.CusID, phonecalls.phonenumber, success.firstsuccess; 

我没有测试它...

注:未建立一个用户未列出成功呼叫。这是好的,还是你需要他们列出?如果是这样,你需要“左连接”:

SELECT phonecalls.CusID, COUNT(0) AS failedcalls, phonenumber, success.firstsuccess FROM phonecalls LEFT JOIN 
(SELECT min(Date) AS firstsuccess, CusID, phonenumber FROM phonecalls WHERE Duration IS NOT NULL GROUP BY CusID, phonenumber) success ON 
phonecalls.CusID = success.CusID AND phonecalls.phonenumber = success.phonenumber AND phonecalls.Date < success.firstsuccess 
GROUP BY phonecalls.CusID, phonecalls.phonenumber, success.firstsuccess;