SQL : Plusieurs « Count » dans une requete

Il peut arriver que vous ayez besoin lors d’une requête SQL de compter le nombre de lignes suivant plusieurs paramètres. Ce n’est pas possible avec un simple « COUNT » il va donc falloir être plus subtile.

Imaginons que l’on a une table de la forme :

id statut nom
1 0 aaaaaaaa
2 1 bbbbbbb
3 0 ccccccc
4 2 dddddd
5 1 eeeeee
6 1 fffffffff

Pour connaitre le nombre de lignes où le statut est à 0, un COUNT classique suffit :

SELECT COUNT(id) FROM table WHERE statut = 0;

Cette requête va simplement compter le nombre de ligne où le champ « statut » est à 0, et va renvoyer 2 dans notre cas.

Mais comment faire si on veut compter le nombre de lignes où le statut est égale à 0, mais aussi à 1 et 2, tout ça dans la même requête ? Et bien il faut utiliser une structure conditionnelle pardi. C’est du SQL donc ça marche aussi bien avec MySQL que PostgreSQL ou autres.

SELECT
SUM(CASE statut WHEN 0 THEN 1 ELSE 0 END),
SUM(CASE statut WHEN 1 THEN 1 ELSE 0 END),
SUM(CASE statut WHEN 2 THEN 1 ELSE 0 END)
FROM table
GROUP BY statut

Cette requête va nous renvoyer le nombre de lignes qui ont un statut à 0, puis 1 et 2. Attention à bien utiliser un « GROUP By » autrement les résultats renvoyés vont être faussés.

Avec CakePHP ça va s’écrire comme ça :

$this->Model->find('all', array(
'fields' => array(
'SUM(CASE Model.statut WHEN 0 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 1 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 2 THEN 1 ELSE 0 END)',
),
'group' => array('Model.statut'),
));

En esperant que ça aide !

Laisser un commentaire