2017-09-11 21 views
0

我需要在一定範圍內0到10秒,0到20秒等內應答呼叫計數。計數將增加,而增量爲當前和下一個計數不同。該百分比將是當前計數/最終計數總數。MySQL - 在一定範圍內應答的計數呼叫0到10秒,按組計數

這裏是你可以用數據用於測試的sqlfiddle:callsdetails的http://sqlfiddle.com/#!9/803d2/2

樣品表:

+-----+----------------+----------+----------+---------------+ 
| id | callid   | callerno | duration | status  | 
+-----+----------------+----------+----------+---------------+ 
| 634 | 1479097551.228 | 1000  |  2 | complete  | 
| 635 | 1479102518.248 | 1000  |  12 | complete  | 
+-----+----------------+----------+----------+---------------+ 

預期結果:

+------------------------+----------+----------+----------+ 
| Ranges     | Count | Delta | %  | 
+------------------------+----------+----------+----------+ 
| Between 0 to 10 secs |  44 | +44  | 84.62 % | 
| Between 0 to 20 secs |  48 | +4  | 92.31 % | 
| Between 0 to 30 secs |  50 | +2  | 96.15 % | 
| Between 0 to 40 secs |  51 | +1  | 98.08 % | 
| Between 0 to 50 secs |  51 | +0  | 98.08 % | 
| Between 0 to 60 secs |  51 | +0  | 98.08 % | 
| Between 0 to 70 secs |  51 | +0  | 98.08 % | 
| Between 0 to 80 secs |  52 | +1  | 100.00 % | 
| Between 0 to 90 secs |  52 | +0  | 100.00 % | 
| Between 0 to 100+ secs |  52 | +0  | 100.00 % | 
+------------------------+----------+----------+----------+ 
Total       52 

我能創造什麼現在正在下面查詢,如果你能幫助提供更好的解決方案,請指教。我現在面臨的問題是(優先級)我無法獲得計數和(次要)最終計數總數(52),現在我手動輸入最終計數總數(52)。請幫忙。

SELECT Ranges,Delta,ROUND(Delta/52*100,2) AS '%' 
FROM 
(
    SELECT 
    (
     IF(duration<=10,'10',IF(duration<=20,'20',IF(duration<=30,'30', 
     IF(duration<=40,'40',IF(duration<=50,'50', 
     IF(duration<=60,'60',IF(duration<=70,'70',IF(duration<=80, 
     '80',IF(duration<=90,'90','100+')))))))))) 
     AS Ranges,COUNT(duration) AS Delta 
     FROM callsdetails 
     GROUP BY Ranges 
    ) a 
GROUP BY Ranges; 

當前結果:

+--------+-------+-------+ 
| Ranges | Delta | %  | 
+--------+-------+-------+ 
| 10  | 44 | 84.62 | 
| 20  |  4 | 7.69 | 
| 30  |  2 | 3.85 | 
| 40  |  1 | 1.92 | 
| 80  |  1 | 1.92 | 
+--------+-------+-------+ 

================================= ==========================================

感謝Etsa for幫助我解決了上述問題,這是所有調用的總和,我現在可能需要再次幫助增加每個隊列名稱的分組。它與上面的公式相同,但現在它必須被拆分或按每個隊列名稱分組。

這裏是你可以用數據用於測試的sqlfiddle:http://sqlfiddle.com/#!9/efe11b/2

預期結果:

+---------+------+-----------+-------+--------+ 
| QUEUE | RAN | TOT_COUNT | DELTA | %  | 
+---------+------+-----------+-------+--------+ 
| sales | 10 |   6 |  6 | 100.00 | 
| sales | 20 |   6 |  0 | 100.00 | 
| sales | 30 |   6 |  0 | 100.00 | 
| sales | 40 |   6 |  0 | 100.00 | 
| sales | 50 |   6 |  0 | 100.00 | 
| sales | 60 |   6 |  0 | 100.00 | 
| sales | 70 |   6 |  0 | 100.00 | 
| sales | 80 |   6 |  0 | 100.00 | 
| sales | 90 |   6 |  0 | 100.00 | 
| sales | 100+ |   6 |  0 | 100.00 | 
| enquiry | 10 |  32 | 32 | 80.00 | 
| enquiry | 20 |  36 |  4 | 90.00 | 
| enquiry | 30 |  38 |  2 | 95.00 | 
| enquiry | 40 |  39 |  1 | 97.50 | 
| enquiry | 50 |  39 |  0 | 97.50 | 
| enquiry | 60 |  39 |  0 | 97.50 | 
| enquiry | 70 |  39 |  0 | 97.50 | 
| enquiry | 80 |  40 |  1 | 100.00 | 
| enquiry | 90 |  40 |  0 | 100.00 | 
| enquiry | 100+ |  40 |  0 | 100.00 | 
| others | 10 |   6 |  6 | 100.00 | 
| others | 20 |   6 |  0 | 100.00 | 
| others | 30 |   6 |  0 | 100.00 | 
| others | 40 |   6 |  0 | 100.00 | 
| others | 50 |   6 |  0 | 100.00 | 
| others | 60 |   6 |  0 | 100.00 | 
| others | 70 |   6 |  0 | 100.00 | 
| others | 80 |   6 |  0 | 100.00 | 
| other | 90 |   6 |  0 | 100.00 | 
| others | 100+ |   6 |  0 | 100.00 | 
+---------+------+-----------+-------+--------+ 
+0

你有沒有嘗試過的東西? SO不是免費的軟件服務。嘗試做出努力,將其張貼在您的問題中,然後尋求幫助。此外,我建議創建一個新問題。 – etsa

+0

嗨Etsa,我真的很抱歉,似乎我利用你的優勢。我一直在嘗試多次修改你的代碼,但越多,我越試圖顯示最終結果是錯誤的。我真的很抱歉打擾你,因爲我不太熟悉這一點,希望能得到你的幫助。我非常抱歉,謝謝你的幫助。 – DarkSilver

回答

0

的一種方式可能是這(使用變量來獲取累計總和,並利用具有JOIN 。所有的間隔最後,我添加了SELECT COUNT(*)一個JOIN獲得52):

SELECT RAN, TOT_COUNT, DELTA, ROUND(TOT_COUNT/E.TOT*100,2) AS '%' 
FROM (SELECT B.RAN, a.Ranges, COALESCE(a.Delta,0) AS DELTA 
     , @r:[email protected]+COALESCE(a.Delta,0) AS TOT_COUNT 
     FROM (SELECT (
        IF(duration<=10,'10',IF(duration<=20,'20',IF(duration<=30,'30', 
        IF(duration<=40,'40',IF(duration<=50,'50', 
        IF(duration<=60,'60',IF(duration<=70,'70',IF(duration<=80, 
        '80',IF(duration<=90,'90','100+')))))))))) 
        AS Ranges,COUNT(duration) AS Delta 
      FROM callsdetails C 
      GROUP BY Ranges) A 
     RIGHT JOIN (SELECT '10' AS RAN, 1 AS ORD UNION ALL SELECT '20', 2 AS ORD UNION ALL SELECT '30', 3 
       UNION ALL SELECT '40', 4 UNION ALL SELECT '50', 5 UNION ALL SELECT '60',6 UNION ALL SELECT '70',7 
       UNION ALL SELECT '80',8 UNION ALL SELECT '90',9 UNION ALL SELECT '100+',10) B ON A.Ranges=B.RAN 
     CROSS JOIN (SELECT @r:=0) T 
     ORDER BY ORD 
    ) D 
CROSS JOIN (SELECT COUNT(*) AS TOT FROM callsdetails) E 
; 

輸出:

RAN TOT_COUNT DELTA % 
10  44  44 84.62 
20  48  4 92.31 
30  50  2 96.15 
40  51  1 98.08 
50  51  0 98.08 
60  51  0 98.08 
70  51  0 98.08 
80  52  1 100 
90  52  0 100 
100+ 52  0 100 

更新(有問題的新請求)。

SELECT queueALL, RAN, TOT_COUNT, DELTA, ROUND(TOT_COUNT/D.TOT*100,2) AS '%' 
FROM (
    SELECT B.queueALL, B.RAN, a.Ranges, COALESCE(a.Delta,0) AS DELTA, B.TOT 
     , CASE WHEN [email protected] THEN @r:[email protected]+COALESCE(a.Delta,0) ELSE @r:=COALESCE(a.Delta,0) END AS TOT_COUNT 
     , @q:=queueALL 
     , ORD 
     FROM (SELECT queuename 
      , CASE WHEN duration DIV 10.0001+1<=9 THEN CAST((duration DIV 10.0001+1)*10 AS CHAR) 
       ELSE '100+' END AS Ranges 
      , COUNT(duration) AS Delta 
      FROM callsdetails C 
      GROUP BY queuename, Ranges) A 
     RIGHT JOIN (SELECT B2.queuename AS queueALL, B2.TOT, B1.RAN, B1.ORD 
        FROM 
        (SELECT queuename, COUNT(*) AS TOT FROM callsdetails GROUP BY queuename) B2 
         CROSS JOIN (SELECT '10' AS RAN,1 AS ORD UNION ALL SELECT '20',2 AS ORD UNION ALL SELECT '30',3 
          UNION ALL SELECT '40',4 UNION ALL SELECT '50',5 UNION ALL SELECT '60',6 UNION ALL SELECT '70',7 
          UNION ALL SELECT '80',8 UNION ALL SELECT '90',9 UNION ALL SELECT '100+',10)B1) B ON A.Ranges=B.RAN AND A.queuename = B.queueALL 
     CROSS JOIN (SELECT @r:=0, @q:='') T 
     ORDER BY queueALL, ORD) D 
ORDER BY queueALL, ORD 

;

輸出:

+----------+------+-----------+-------+------+ 
| queueALL | RAN | TOT_COUNT | DELTA | % | 
+----------+------+-----------+-------+------+ 
| enquiry | 10 |  32 | 32 | 80 | 
| enquiry | 20 |  36 |  4 | 90 | 
| enquiry | 30 |  38 |  2 | 95 | 
| enquiry | 40 |  39 |  1 | 97.5 | 
| enquiry | 50 |  39 |  0 | 97.5 | 
| enquiry | 60 |  39 |  0 | 97.5 | 
| enquiry | 70 |  39 |  0 | 97.5 | 
| enquiry | 80 |  40 |  1 | 100 | 
| enquiry | 90 |  40 |  0 | 100 | 
| enquiry | 100+ |  40 |  0 | 100 | 
| others | 10 |   6 |  6 | 100 | 
| others | 20 |   6 |  0 | 100 | 
| others | 30 |   6 |  0 | 100 | 
| others | 40 |   6 |  0 | 100 | 
| others | 50 |   6 |  0 | 100 | 
| others | 60 |   6 |  0 | 100 | 
| others | 70 |   6 |  0 | 100 | 
| others | 80 |   6 |  0 | 100 | 
| others | 90 |   6 |  0 | 100 | 
| others | 100+ |   6 |  0 | 100 | 
| sales | 10 |   6 |  6 | 100 | 
| sales | 20 |   6 |  0 | 100 | 
| sales | 30 |   6 |  0 | 100 | 
| sales | 40 |   6 |  0 | 100 | 
| sales | 50 |   6 |  0 | 100 | 
| sales | 60 |   6 |  0 | 100 | 
| sales | 70 |   6 |  0 | 100 | 
| sales | 80 |   6 |  0 | 100 | 
| sales | 90 |   6 |  0 | 100 | 
| sales | 100+ |   6 |  0 | 100 | 
+----------+------+-----------+-------+------+ 
+0

嗨Etsa,非常感謝您的解決方案,我一直有這個問題相當一段時間,真的很感謝您的幫助。 (^_^) – DarkSilver

+0

嗨Etsa,我有一個新問題需要您的幫助。上次你幫我解決了上面所有調用問題的問題時,我現在需要再次幫助增加每個隊列名稱的分組。它與上面的公式相同,但現在它必須被拆分或按每個隊列名稱分組。請參閱上面的預期結果。 以下是您可以使用數據進行測試的sqlfiddle:http://sqlfiddle.com/#!9/efe11b/2 – DarkSilver

+0

@DarkSilver添加了新版本,其中包括queuename。 – etsa

相關問題