En plus de pouvoir regrouper des données à l’aide de GROUP BY, SQL vous permet également de filtrer les groupes à inclure et ceux à exclure.
Par exemple, vous pouvez souhaiter une liste de tous les clients qui ont passé au moins deux commandes. Pour obtenir ces données, vous devez filtrer en fonction du groupe complet, et non des lignes individuelles.
HAVING est très similaire à WHERE. La seule différence est que WHERE filtre les lignes et HAVING filtre les groupes. WHERE filtre avant que les données ne soient regroupées et HAVING filtre après que les données soient regroupées.
De plus, la clause HAVING a été ajoutée à SQL car le mot-clé WHERE ne pouvait pas être utilisé avec les fonctions d’agrégation.
Base de données DB2 :
Vous trouverez ci-dessous une sélection de la table “Commandes” de la base de données DB2.
Numéro-Commande | Numéro-Client | Date-Commande |
---|---|---|
1001 | 10 | 2020-09-08 |
1002 | 99 | 2020-09-01 |
1003 | 17 | 2020-08-25 |
1004 | 76 | 2020-07-19 |
1005 | 99 | 2020-09-21 |
1006 | 17 | 2020-08-25 |
1007 | 76 | 2020-05-19 |
1008 | 99 | 2020-03-01 |
1009 | 30 | 2020-06-25 |
1010 | 40 | 2020-09-19 |
1011 | 76 | 2020-05-19 |
1011 | 99 | 2020-05-19 |
Exemple 1:
L’instruction SQL suivante sélectionne la liste de tous les clients qui ont passé au moins deux commandes.
SELECT Numero_Client, COUNT(*) AS Commandes
FROM Commandes
GROUP BY Numero_Client
HAVING COUNT(Numero_Client) >= 2;
Dans cette instruction, la clause GROUP BY est utilisée pour regrouper les données par numéro de client afin que la fonction COUNT(*) puisse renvoyer le nombre de commandes passées par chaque numéro de client.
La clause HAVING filtre les données afin que seules les commandes avec deux éléments ou plus soient renvoyées.
Résultat:
Numéro-Client | Commandes |
---|---|
17 | 2 |
76 | 3 |
99 | 4 |
Exemple 2 : Regroupement et tri
Pour trier la sortie de GROUP BY, vous devez utiliser ORDER BY.
SELECT Numero_Client, COUNT(*) AS Commandes
FROM Commandes
GROUP BY Numero_Client
HAVING COUNT(Numero_Client) >= 2;
ORDER BY COUNT(Numero_Client) DESC;
Dans cette instruction, la clause GROUP BY est utilisée pour regrouper les données par numéro de client afin que la fonction COUNT(*) puisse renvoyer le nombre de commandes passées par chaque numéro de client.
La clause HAVING filtre les données afin que seules les commandes avec deux éléments ou plus soient renvoyées. Enfin, la sortie est triée à l’aide de la clause ORDER BY.
Résultat:
Numéro-Client | Commandes |
---|---|
99 | 4 |
76 | 3 |
17 | 2 |