2017-09-11 2 views
0

Je dois compter l'appel répondu dans certaines plages 0 à 10 sec, 0 à 20 sec, etc. Le nombre augmentera tandis que le delta sera le compte différent entre le courant et le prochain. Le% sera le nombre actuel/le total final.MySQL - Compter l'appel répondu dans certaines plages 0 à 10 sec, grouper par compte

Voici le sqlfiddle que vous pouvez utiliser avec des données pour les tests: http://sqlfiddle.com/#!9/803d2/2

table Exemple de callsdetails:

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

Résultat attendu:

+------------------------+----------+----------+----------+ 
| 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 

Ce que je suis en mesure de créer maintenant est ci-dessous la requête, si vous pouvez aider à fournir une meilleure solution, s'il vous plaît des conseils. Le problème auquel je fais face maintenant est (priorité) je ne suis pas capable d'obtenir le compte et (secondaire) le total final compte (52) pour le%, maintenant je mets manuellement dans le total final compte (52). S'il vous plaît aider.

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; 

Résultat actuel:

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

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

Merci à Etsa pour m'aider à résoudre problème ci-dessus qui est le total de tous les appels, je pourrais avoir besoin d'aide à nouveau maintenant avec l'ajout de grouper par nom de file d'attente. C'est la même formule avec ci-dessus mais maintenant il doit être divisé ou groupe par nom de file d'attente.

Voici le sqlfiddle que vous pouvez utiliser avec des données pour les tests: http://sqlfiddle.com/#!9/efe11b/2

Résultat attendu:

+---------+------+-----------+-------+--------+ 
| 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

Avez-vous essayé quelque chose? SO n'est pas un service de logiciel libre. Essayez de faire un effort, affichez-le dans votre question et demandez de l'aide. De plus, je suggère de créer une nouvelle question. – etsa

+0

Salut Etsa, je suis vraiment désolé de faire croire que je profite de vous. J'ai essayé plusieurs fois de modifier votre code, mais plus j'essaie, plus le résultat affiché est faux. Je suis vraiment désolé de vous déranger car je ne suis pas familier avec cela et j'espère avoir de l'aide de votre part. Je suis vraiment désolé et merci pour votre aide. – DarkSilver

Répondre

0

Une façon pourrait être cette (en utilisant la variable pour obtenir la somme cumulée, et en utilisant un JOIN avec . tous les intervalles enfin j'ai ajouté un JOIN avec SELECT COUNT (*) pour obtenir 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 
; 

sortie:

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 

Mise à jour (nouvelle demande en question).

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 

;

Sortie:

+----------+------+-----------+-------+------+ 
| 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

Salut Etsa, Merci beaucoup pour votre solution, j'ai eu ce problème pendant un certain temps, apprécie vraiment votre aide. (^_^) – DarkSilver

+0

Salut Etsa, j'ai un nouveau problème qui nécessitera votre aide.La dernière fois que vous m'avez aidé à résoudre le problème ci-dessus qui est le total de tous les appels, je vais avoir besoin d'aide maintenant avec l'ajout de grouper par nom de file d'attente. C'est la même formule avec ci-dessus mais maintenant il doit être divisé ou groupe par nom de file d'attente. Veuillez voir ci-dessus pour le résultat attendu. Voici la sqlfiddle que vous pouvez utiliser avec des données pour les tests: http://sqlfiddle.com/#!9/efe11b/2 – DarkSilver

+0

@DarkSilver Nouvelle version ajoutée, qui inclut le nom de queues. – etsa