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 :
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 :
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.