Clause SQL HAVING

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-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-07-19
1005992020-09-21
1006172020-08-25
1007762020-05-19
1008992020-03-01
1009302020-06-25
1010402020-09-19
1011762020-05-19
1011992020-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-ClientCommandes
172
763
994

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-ClientCommandes
994
763
172