La clause GROUP BY permet de regrouper les enregistrements qui répondent à une condition. Chaque ligne du résultat de la requête sera donc calculée à partir de plusieurs enregistrements.
Ex : La requête suivante permet d'afficher le prix total de chaque réparation puisqu'une réparation peut comporter plusieurs lignes de détails.
SELECT id, SUM(prix) AS total
FROM lignesfactures
GROUP BY facture_id;
Théoriquement, il est possible d'appliquer la clause GROUP BY sur n'importe quel champ. Dans la pratique, cependant, on fera presque toujours un GROUP BY sur une clé étrangère.
Ex : Cette requête permet de compter le nombre de voitures pour chacun des modèles. Remarquez que le GROUP BY est appliqué sur la clé étrangère modele_id.
SELECT modele_id, COUNT(*) as nombre_voitures
FROM voitures
GROUP BY modele_id;
Lorsqu'une requête travaille sur deux tables liées par un INNER JOIN, il faut faire attention au champ employé dans le GROUP BY. Dans l'exemple du nombre de voitures par modèle, il pourrait être tentant de regrouper les enregistrements sur le nom de modèle plutôt que sur l'identifiant.
Ex :
SELECT nom, COUNT(*) as nombre_voitures
FROM voitures
INNER JOIN modeles ON modele_id = modeles.id
GROUP BY
;Puisque, dans la base de données, rien n'empêche d'entrer deux modèles qui portent le même nom (il n'y a pas d'index unique), la requête pourrait ne pas donner de bons résultats.
On devrait plutôt appliquer le GROUP BY sur le champ modele_id puisqu'il s'agit d'une information unique dans la table contenant la clé primaire.
Notez que puisque modeles.id et voitures.modele_id sont les champs utilisés dans la jointure, on aurait obtenu les mêmes résultats en faisant le GROUP BY sur l'un ou sur l'autre.
SELECT modeles.id, nom, COUNT(*) as nombre_voitures
FROM voitures
INNER JOIN modeles ON modele_id = modeles.id
GROUP BY modele_id;
Pour qu'une requête utilisant la clause GROUP BY soit valide, il faut que chaque colonne affichée soit :
ou
ou
Ex :
SELECT mecanicien_id, nomfamille, COUNT(*) AS nombre_factures
FROM factures
INNER JOIN mecaniciens ON mecanicien_id = mecaniciens.id
GROUP BY mecanicien_id;
▼Publicité