Problème :
Vous devez trouver des lignes dans lesquelles les groupes ont une somme de valeurs dans une colonne inférieure à une valeur donnée.
Exemple :
Notre base de données a une table nommée company
avec des données dans les colonnes suivantes :id
, department
, first_name
, last_name
, et salary
.
identifiant | département | prénom | nom_de_famille | salaire |
---|---|---|---|---|
1 | marketing | Lora | Marron | 2 300 |
2 | finances | Jean | Jackson | 3200 |
3 | marketing | Michel | Thomson | 1270 |
4 | production | Tony | Miller | 6 500 |
5 | production | Sally | Vert | 2 500 |
6 | finances | Olivier | Noir | 3450 |
7 | production | Jeniffer | Michelin | 2800 |
8 | marketing | Jérémy | Lorson | 3600 |
9 | marketing | Louis | Smith | 4200 |
Trouvons les noms des départements qui ont des sommes de salaires de ses employés inférieures à 7000.
Solution :
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Voici le résultat :
département | somme |
---|---|
finances | 6550 |
Discussion :
Pour filtrer les enregistrements à l'aide de la fonction d'agrégation (la fonction SUM précédemment), utilisez la clause HAVING. Pour calculer la somme des valeurs de chaque groupe de lignes, utilisez la fonction d'agrégation SOMME. Dans cette requête, la colonne département est calculée avec la somme de tous les salaires de ses employés en tant que groupe (calculez-la avec la fonction SOMME avec la colonne salaire comme argument). Étant donné que vous calculez la valeur de chaque groupe de lignes (nous regroupons les lignes en fonction du nom du département), la requête contient une clause GROUP BY avec le nom de la colonne pour regrouper les lignes (dans notre exemple, GROUP BY department
). La dernière étape consiste à utiliser la fonction d'agrégation dans la clause HAVING. N'oubliez pas que HAVING doit être placé après la clause GROUP BY. HAVING contient la condition comparant la valeur renvoyée par la fonction d'agrégation à une valeur donnée. D'en haut, ce sont les sommes salariales d'une valeur inférieure à 7000 (SUM(salary)<7000
). Ici, nous vérifions que la somme des salaires dans chaque département est inférieure à 7 000. La requête n'a affiché qu'un seul département, les finances, avec des salaires de 6 550.