2017-08-25 4 views
1

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 nombre différent entre le courant et le prochain. Le% sera le nombre actuel/le total final.Compter l'appel répondu dans certaines plages 0 à 10 sec, grouper par nombre

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

Vous pourriez juste 'UNION' un compte total vers le bas. aussi à quoi ressemble la table d'origine? – RealCheeseLord

+0

J'ai ajouter dans le tableau d'exemple ci-dessus pour référence à la table d'origine. S'il vous plaît donnez votre avis. – DarkSilver

Répondre

0

Si je comprends bien votre problème, vous voulez juste ROLLUP groupant funtion dans mysql

votre requête

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 WITH ROLLUP; 

FOR MORE REFERENCE

+0

Salut denny, merci pour l'info. Pouvez-vous prendre à regarder le "résultat actuel" ci-dessus, comment puis-je ajouter dans le "Count" qui va augmenter à chaque plage comme dans le "résultat attendu" car c'est là que devrait être le total qui est nécessaire. Maintenant, lorsque j'exécute la requête, elle ajoute 1 nouvelle ligne en bas. | NULL | 1 | 1,92 | ROLLUP ne peut-il être utilisé que pour afficher le total? Je ne peux pas utiliser la valeur pour%? La formule% est le nombre actuel/le nombre total final. Merci encore pour votre aide, s'il vous plaît des conseils si vous le savez. – DarkSilver

+0

Donnez-moi sqlfiddle – denny

+0

Salut denny, voici le sqlfiddle. http://sqlfiddle.com/#!9/803d2/1 laissez-moi savoir si vous avez une meilleure solution. Merci de votre aide. – DarkSilver