• 12 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 15/05/2023

Filtrez vos données agrégées avec HAVING

Au chapitre précédent, nous avons trouvé dans quels pays nos 2 intermédiaires avaient aidé à créer des sociétés. Mais on va ici affiner un peu notre recherche pour trouver dans quels pays les 2 intermédiaires ont eu la plus grande activité.

Découvrez HAVING

Pour rappel, voici la table que nous avions obtenue au chapitre précédent :

Notre table à ce stade du cours, avec ses différentes lignes et colonnes
Notre table à ce stade du cours

On pourrait faire cela en filtrant cette table en ne gardant que les lignes pour lesquelles les valeurs de cette colonne sont au-dessus d'un certain seuil.

Par exemple, je pourrais souhaiter avoir les juridictions dans lesquelles les deux intermédiaires ont créé plus de 50 sociétés, c'est-à-dire les lignes pour lesquelles la colonne nb_societes  est supérieure à 50.

Il faut donc effectuer un filtrage sur cette table.

Pour l'effectuer, je pourrais me dire que les filtrages, c'est dans le mot clé WHERE. Cependant, la condition qui est spécifiée dans le WHERE est vérifiée avant que l'agrégation ne soit effectuée.

Ici, nous voulons effectuer un filtrage après l'agrégation. Pour cela, on n'utilise pas WHERE mais HAVING :

SELECT
	i.id AS intermediary_id,
	i.name AS intermediary_name,
	e.jurisdiction,
	e.jurisdiction_description,
	count(*) as nb_societes
FROM
	intermediary i,
	assoc_inter_entity a,
	entity e
WHERE
	a.entity = e.id AND
	a.inter = i.id AND
	(i.id = 5000 OR i.id = 5001)
GROUP BY
	i.id, i.name, e.jurisdiction, e.jurisdiction_description
HAVING
	count(*) > 50 ;

C'est après ce mot clé HAVING que vous pouvez spécifier que count(*) doit être supérieur à 50.

Au passage, il est tout naturel de mettre une fonction d'agrégation dans le HAVING, ce qui n'est pas possible dans le WHERE.

Regardons le résultat de cette requête :

Résultat de la requête
Résultat de la requête

J'obtiens ici les trois lignes pour lesquelles la valeur de "nb_societes" est supérieure à 50.

Ces pays sont-ils des paradis fiscaux ? Une petite recherche sur Internet nous indique que ... non.

Mais vous ne perdez pas espoir : en tant que journaliste, vous êtes tenace !

À vous de jouer

Contexte

En regardant dans la base, vous vous apercevez que les intermédiaires ont eu des activités sur une grande période de temps. En effet, l'intermédiaire Pacher Banking aurait, selon votre BDD, créé une société en 1990 ! Pour votre article, il est important de situer les événements dans le temps : vos infos sont-elles récentes ou pas ?

Afin d'affiner la période sur laquelle vous vous concentrerez pour votre article, vous décidez donc de modifier la requête précédente en ne gardant que les juridictions dans lesquelles au moins l'un des 2 intermédiaires a créé une (ou des) sociétés après le 1er janvier 2010.

Consignes

Modifiez la requête en ne gardant que les lignes satisfaisant ces 2 conditions en même temps :

  • count(*) est supérieur à 10 ;

  • max(incorporation_date) est supérieur ou égal au 1er janvier 2010.

Vérifiez votre travail

Il faut transformer la condition du HAVING en mettant les 2 conditions voulues séparées par AND :

max(incorporation_date) >= '2010-01-01' AND nb_societes > 10

Voici la structure de la requête à obtenir :

SELECT
    i.id AS intermediary_id,
    i.name AS intermediary_name,
    e.jurisdiction,
    e.jurisdiction_description,
    count(*) as nb_societes,
    max(incorporation_date)
FROM
    intermediary i,
    assoc_inter_entity a,
    entity e
WHERE
    a.entity = e.id AND
    a.inter = i.id AND
    (i.id = 5000 OR i.id = 5001)
GROUP BY
    i.id, i.name, e.jurisdiction, e.jurisdiction_description
HAVING
    max(incorporation_date) >= '2010-01-01' AND nb_societes > 10 ;

En résumé

  • La condition dans le WHERE est vérifiée avant l'agrégation.

  • Pour restreindre les lignes après l'agrégation, il faut utiliser HAVING.

  • La condition dans le HAVING fait intervenir une fonction d'agrégation.

Au chapitre suivant, nous apprendrons comment trier les lignes d'une table.

Exemple de certificat de réussite
Exemple de certificat de réussite