2016-09-17 92 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;