Bonjour,
J'essaye de compter le nombre d'occurrences des différents statuts possibles et groupés par date.
ma table :
ce que je veux obtenir :
Qu'est ce que vous en pensez?
Bonjour,
J'essaye de compter le nombre d'occurrences des différents statuts possibles et groupés par date.
ma table :
ce que je veux obtenir :
Qu'est ce que vous en pensez?
bonjour,
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT date, `status`, COUNT(*) AS nombre FROM table GROUP BY date, `status`
PS: status est un mot clé réservé MySQL
Merci pour la réponse mais ca ne permet de compter qu'un seul statut.
En fait je viens de trouver la réponse. C'est marrant : après avoir galéré plus d'une journée là dessus, il suffit que je poste mon problème pour trouver la réponse par moi même en 15 minutes :
Je pensais pas qu'on pouvait faire des sous requêtes dans le select et avoir acces aux alias de la 'requete mere'. Mais j'ai essayé et ca marche!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select left(request_time, 10) as on_date, ((select count(job_id) as n1 from table where status='done' and left(request_time, 10) = on_date)) as nb_done, ((select count(job_id) as n2 from table where status='refused' and left(request_time, 10) = on_date)) as nb_refused, ((select count(job_id) as n3 from table where status='error' and left(request_time, 10) = on_date)) as nb_error from table group by left(request_time, 10) order by left(request_time, 10) desc
...Et pour arriver à la présentation souhaitée, on devrait pouvoir le faire en écrivant ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 SELECT date, SUM(IF(`status`='done',nombre,0) AS nb_done, SUM(IF(`status`='refused',nombre,0) AS nb_refused, SUM(IF(`status`='error',nombre,0) AS nb_error FROM ( SELECT date, `status`, COUNT(*) AS nombre FROM TABLE GROUP BY date, `status` ) AS stats GROUP BY date ;
Plutôt que des sous-requêtes, tu peux utiliser CASE, ce sera peut-être plus performant :
En plus de STATUS, DATE et TABLE sont aussi des mots réservés SQL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SELECT LEFT(request_time, 10) AS on_date, SUM( CASE WHEN `STATUS` = 'done' THEN 1 ELSE 0 END ) AS nb_done, SUM( CASE WHEN `STATUS` = 'refused' THEN 1 ELSE 0 END ) AS nb_refused, SUM( CASE WHEN STATUS = 'error' THEN 1 ELSE 0 END ) AS nb_error FROM `TABLE` GROUP BY LEFT(request_time, 10) ORDER BY LEFT(request_time, 10) DESC
EDIT : CASE est normalisé SQL mais je crois que IF est réservé au langage procédural et pas avec cette syntaxe mais l'habituel IF THEN ELSE.
oui et non :
ca ne donne pas les résultats sous la forme souhaitée, (une ligne par date, une colonne par statut) mais sous la forme "une ligne par date et statut"
D'autre part, si pour une date donnée aucune ligne ne présente un statut donné, votre requete ne ressortira pas ce couple date/statut en question, alors que les requêtes de NicoD et de Cinephil afficheront bien 0
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager