Retour à la liste des articles Articles
4 minutes de lecture

Comment utiliser les fonctions d'agrégation dans la clause WHERE

Le filtrage des données en fonction du résultat d'une fonction d'agrégation est une tâche d'analyse de données courante. Alors comment utiliser les agrégats dans la clause WHERE dans la clause WHERE ? Nous allons consacrer tout cet article à répondre à cette question.

La combinaison de fonctions d'agrégation et le filtrage sur la base de leurs résultats sont souvent utilisés dans l'analyse de données - par exemple pour afficher les branches dont le chiffre d'affaires total est supérieur à X, les pays dont le nombre de messages est inférieur à Y, les étudiants dont la note moyenne est inférieure à Z, etc.

Les utilisateurs novices de SQL tentent souvent d'effectuer ce type de filtrage dans la clause WHERE. Mais comme nous allons le voir dans cet article, ce n'est pas une solution viable.

Voyons donc comment vous pouvez obtenir les résultats dont vous avez besoin. Tout d'abord, nous allons examiner notre ensemble de données. Dans ce cas, l'exemple est basé sur les données de l'European Climate Assessment & Dataset.

Exemple de données

Notre jeu de données se compose d'une seule table : temperature_data. Elle stocke des informations sur la température maximale journalière enregistrée dans plusieurs villes. Les colonnes sont :

  • id - L'identifiant de la température enregistrée.
  • city - La ville où la température a été enregistrée.
  • date - La date à laquelle la température a été enregistrée.
  • temperature - La température la plus élevée enregistrée (en degrés Celsius).

Pour être plus graphique, voici toutes les données de la table.

idcitydatetemperature
1Szczecin2022-05-3118.60
2Szczecin2022-05-3017.20
3Szczecin2022-05-2916.40
4Szczecin2022-05-2814.70
5Szczecin2022-05-2717.00
6Rotterdam2022-05-3118.40
7Rotterdam2022-05-3014.50
8Rotterdam2022-05-2914.50
9Rotterdam2022-05-2815.80
10Rotterdam2022-05-2716.10
11Berlin2022-05-3121.00
12Berlin2022-05-3017.50
13Berlin2022-05-2915.20
14Berlin2022-05-2816.30
15Berlin2022-05-2718.50

Une fonction d'agrégation dans la clause WHERE ?

Ce que je veux faire avec ces données, c'est trouver la température moyenne la plus élevée par ville et n'afficher que les villes dont la moyenne est supérieure à 16°C.

Les nouveaux analystes pourraient écrire la requête en utilisant la fonction d'agrégation AVG() dans la clause WHERE:

SELECT city,
	 AVG(temperature) AS average_max_temperature
FROM temperature_data
WHERE AVG(temperature) > 16
GROUP BY city;

D'abord, nous trouvons la température moyenne la plus élevée par ville. Ensuite, nous utilisons ce résultat dans la clause WHERE; cela semble correct. Mais cette requête génère une erreur !

Comment utiliser les fonctions agrégées dans la clause WHERE ?

Et cette erreur répond très explicitement à la question de savoir comment utiliser les fonctions d'agrégation dans la clause WHERE: vous ne devez pas le faire !

Les fonctions d'agrégation ne sont pas autorisées car la clause WHERE est utilisée pour filtrer les données avant l' agrégation. Ainsi, si WHERE ne sert pas à l'agrégation, il a d'autres utilisations.

Pour filtrer les données en fonction du résultat d'une fonction d'agrégation, vous devez utiliser la clause HAVING clause.

Utilisation des fonctions d'agrégation dans la clause HAVING

Il est simple de corriger la requête ci-dessus : il suffit de remplacer WHERE par HAVING. La clause HAVING est utilisée pour filtrer les données, tout comme WHERE. La principale différence entre WHERE et HAVING est la suivante HAVING filtre les données après l' agrégation. Ainsi, lorsque vous écrivez du code, vous devez vous assurer que la clause HAVING vient après GROUP BY. Cela a quelque chose à voir avec l'ordre des opérations en SQL.

Réécrivons notre requête précédente, en supprimant WHERE et en ajoutant HAVING (après GROUP BY, bien sûr !):

SELECT city,
	 AVG(temperature) AS average_highest_daily_temperature
FROM temperature_data
GROUP BY city
HAVING AVG(temperature) > 16;

Une fois encore, nous sélectionnons la ville et trouvons la température moyenne à l'aide de la fonction AVG(). Mais maintenant, les données sont regroupées par ville et filtrées à l'aide de la clause HAVING pour n'afficher que les moyennes supérieures à 16.

cityaverage_highest_daily_temperature
Szczecin16.78
Berlin17.70

À partir des données d'origine, les villes de Szczecin et de Berlin sont conservées car leur température quotidienne moyenne la plus élevée est supérieure à 16 °C.

Fonctions agrégées et filtrage vont de pair, mais pas dans la clause WHERE

Le fait de savoir que vous ne pouvez pas utiliser les fonctions d'agrégation dans la clause WHERE ne constitue qu'une partie de la réponse. Bien sûr, vous avez toujours besoin d'un moyen de filtrer en utilisant le résultat des fonctions d'agrégation. La clause HAVING est ce moyen !

Les deux clauses se ressemblent beaucoup, notamment parce que la manière de définir une condition est la même. Cependant, l'important ici est de savoir que les fonctions d'agrégation peuvent être utilisées dans HAVING, mais pas dans WHERE.

Pour que cette différence vous vienne naturellement, vous devrez écrire beaucoup de code. Et pour cela, vous aurez besoin de nombreux exemples, ce qui est exactement l'objet de notre cours. La pratique du SQL cours.