TUTORIEL · QLIK SENSE

Comprendre Aggr()

Agrégations imbriquées, table virtuelle, granularité, Set Analysis, pièges et performances : Aggr() expliqué étape par étape.

Comprendre Aggr()

Aggr() sert à effectuer une agrégation en deux étapes. Qlik calcule d’abord une mesure pour chaque valeur d’une ou plusieurs dimensions, puis une agrégation externe travaille sur le tableau de résultats obtenu.

La meilleure image mentale est celle d’une petite table virtuelle temporaire : Aggr() construit les lignes intermédiaires, puis Max(), Avg(), Sum(), Count() ou une autre fonction exploite ces lignes.

Si le besoin ne comporte qu’un seul niveau d’agrégation, Aggr() est probablement inutile.

Exemple · Le principe en une expression

Deux niveauxMax(Aggr(Sum(Montant), Commande))1. total par commande → 2. plus grande commande
Étape 1Sum(Montant) par Commande
Étape 2Max() sur les résultats
RésultatValeur de la plus grosse commande

Visualiser la table virtuelle

Aggr() renvoie un tableau de valeurs. Avec Aggr(Sum(Montant), Commande), Qlik produit conceptuellement une ligne par commande avec son montant total.

Cette table n’est pas visible dans l’application. Pour déboguer une expression difficile, il est souvent très efficace de recréer temporairement cette table dans un tableau Qlik avec les mêmes dimensions et la même mesure.

Penser « table virtuelle » rend Aggr() beaucoup plus simple à comprendre.

Exemple

CommandeSum(Montant)
C001450 €
C0021 250 €
C003780 €
Dimension AggrCommande
Mesure interneSum(Montant)
Table virtuelle1 ligne par commande

Trouver la plus grosse commande

Une commande peut contenir plusieurs lignes. Il faut donc d’abord additionner les lignes par commande, puis chercher le maximum parmi les totaux obtenus.

C’est le cas d’école parfait pour Aggr() : deux grains successifs et deux agrégations distinctes.

L’agrégation interne répond à « combien par commande ? » ; l’externe à « laquelle est la plus grande ? ».

Exemple

ExpressionMax(Aggr(Sum(Montant), Commande))Sum() calcule chaque commande ; Max() sélectionne la plus élevée
InterneSum(Montant)
DimensionCommande
ExterneMax()

Moyenne des commandes

Pour calculer la moyenne des montants de commande, on peut moyenner la liste des totaux calculés par commande.

Mais HIC rappelle un point important : si le calcul peut être réécrit plus simplement sous forme de ratio, la version sans Aggr() est souvent plus lisible et plus rapide.

Aggr() n’est pas un objectif : si une expression plus simple donne exactement le même résultat, préférez-la.

Exemple

Avec Aggr()Avg(Aggr(Sum(Montant), Commande))À comparer, selon le modèle, avec Sum(Montant) / Count(DISTINCT Commande)
Avec AggrAvg des totaux par commande
AlternativeRatio de deux agrégations
ChoixPrivilégier le plus simple si équivalent

Aggr() avec plusieurs dimensions

La table virtuelle peut être construite sur plusieurs dimensions. Qlik produit alors une valeur par combinaison distincte des dimensions indiquées.

Par exemple, Aggr(Sum(Montant), Produit, Mois) crée conceptuellement une ligne par couple Produit–Mois.

Avant d’écrire Aggr(), dites à voix haute : « je veux une ligne virtuelle par… ».

Exemple

ExpressionAvg(Aggr(Sum(Montant), Produit, Mois))moyenne des ventes calculées au grain Produit × Mois
GrainProduit × Mois
InterneSum(Montant)
ExterneAvg()

Le piège du grain

Dans un graphique, il faut comparer le grain des dimensions du graphique avec celui des dimensions utilisées dans Aggr(). Le grain d’Aggr() doit être identique ou plus fin que celui du graphique.

Un Aggr() au niveau Mois peut alimenter un graphique au niveau Année si Mois porte bien l’année et le mois. L’inverse — Aggr() par Année dans un graphique par Mois — peut produire des NULL ou affecter la valeur à un seul mois.

Un résultat étrange avec des NULL ? Vérifiez le grain avant de toucher au Set Analysis.

Exemple

CorrectGraphique : Année · Aggr : MoisAggr() est au même grain ou à un grain plus fin
GraphiqueAnnée
AggrMois
RègleAggr ≥ finesse du graphique

Agrégation interne et externe

Le premier paramètre d’Aggr() doit être une mesure agrégée. Ensuite, lorsque le tableau virtuel contient plusieurs valeurs, une agrégation externe est normalement nécessaire pour obtenir le résultat final.

Omettre l’un de ces niveaux peut conduire Qlik à utiliser implicitement Only(), avec des NULL inattendus.

Quand vous relisez une expression Aggr(), identifiez systématiquement les deux niveaux.

Exemple

Bonne structureAvg(Aggr(Sum(Montant), Client))Sum() = interne · Avg() = externe
InterneToujours une agrégation
AggrProduit un tableau de valeurs
ExterneAgrège ce tableau

Aggr() et Set Analysis

Avec Aggr(), le Set Analysis peut agir sur l’étape interne, sur l’étape externe ou sur le contexte de l’Aggr(). La bonne position dépend de l’étape à laquelle la condition doit réellement s’appliquer.

Une bonne règle de départ est de tester la condition aux deux niveaux lorsque le même ensemble doit gouverner tout le calcul, puis de vérifier le résultat. Pour les cas complexes, raisonnez étape 1 / étape 2 plutôt que de recopier mécaniquement le même Set.

Le Set interne n’hérite pas simplement du contexte de l’agrégation externe : les contextes doivent être compris explicitement.

Exemple

ExempleMax({<Annee={2026}>} Aggr(Sum({<Annee={2026}>} Montant), Commande))le contexte est explicitement maîtrisé aux deux niveaux
Question 1Quand filtrer les lignes source ?
Question 2Quand filtrer le résultat intermédiaire ?
MéthodeRaisonner sur les deux étapes

Où placer le Set ?

Supposons que la valeur d’une commande ne doive compter que les produits « Chaussures ». Ce filtre doit intervenir pendant le calcul de la commande : il appartient donc à l’étape interne.

À l’inverse, si l’étape interne doit volontairement calculer un classement sur tous les produits et que vous ne voulez sélectionner qu’ensuite une catégorie, la condition appartient à l’étape externe.

Demandez-vous toujours : « à quel moment de mon calcul cette condition doit-elle agir ? ».

Exemple

RéflexeCondition sur les données → interneCondition sur le tableau virtuel / résultat → externe
InterneConstruit la valeur intermédiaire
ExterneChoisit/agrège les résultats
DécisionPlacer le filtre à l’étape où il a un sens

Quand TOTAL suffit

Aggr() n’est pas nécessaire pour tous les calculs qui changent de périmètre. Pour un sous-total dans le même graphique, le qualificateur TOTAL est souvent la solution directe.

Par exemple, un pourcentage du total peut généralement être calculé avec Sum(Montant) / Sum(TOTAL Montant), sans construire de table virtuelle.

Avant Aggr(), vérifiez toujours si TOTAL, une agrégation standard ou un ratio suffit.

Exemple

Plus simpleSum(Montant) / Sum(TOTAL Montant)pas d’Aggr() pour un simple pourcentage du total
BesoinSous-total / total du graphique
OutilTOTAL
Aggr ?Non, si TOTAL répond au besoin

Quand calculer dans le script

Si une classification agrégée doit rester statique quelle que soit la sélection, elle est souvent mieux calculée dans le script de chargement avec Group By puis stockée comme attribut.

Exemple : classer définitivement les clients selon leur chiffre d’affaires annuel de référence. Si cette classe ne doit pas varier avec les sélections, inutile de la recalculer dynamiquement avec Aggr().

Le bon calcul au bon endroit : moteur d’interface pour le dynamique, script pour le stable.

Exemple

StatiqueLOAD Client, Sum(Montant) ... GROUP BY Clientpré-calculer lorsque la valeur n’a pas besoin d’être dynamique
DynamiqueAggr() peut être pertinent
StatiquePré-calcul dans le modèle
GainCalcul évité dans l’interface

DISTINCT et NODISTINCT

Par défaut, Aggr() travaille sur les combinaisons distinctes de dimensions. Le qualificateur NODISTINCT peut produire plusieurs valeurs pour une même combinaison selon la structure des données.

Avec une seule dimension, NODISTINCT peut renvoyer autant d’éléments que de lignes source. C’est puissant, mais à réserver aux cas où ce comportement est réellement voulu.

Si vous n’avez pas une raison précise d’utiliser NODISTINCT, restez sur le comportement standard.

Exemple

SyntaxeAggr(NODISTINCT Sum(Montant), Client)ne pas utiliser NODISTINCT « pour essayer » : comprendre d’abord le grain attendu
DéfautCombinaisons distinctes
NODISTINCTPeut répéter les valeurs
UsageCas avancés

Le tri dans Aggr()

Certaines fonctions dépendantes de l’ordre nécessitent un tri explicite de la dimension dans le paramètre structuré d’Aggr(). Qlik permet d’indiquer un type de tri et un ordre.

Supposons les chiffres d’affaires annuels suivants : 2023 = 100, 2024 = 135, 2025 = 120 et 2026 = 180. Une fois les années triées dans l’ordre numérique croissant, les évolutions sont +35, -15 et +60.

Sans le tri numérique croissant, Above() peut comparer les années dans un ordre différent et produire une progression erronée.

Exemple

Plus forte progression annuelleMax(Aggr(Sum(CA) - Above(Sum(CA)), (Annee,(NUMERIC,ASCENDING))))résultat : 60, entre 2025 et 2026
Données100 · 135 · 120 · 180
Évolutions+35 · -15 · +60
Résultat60

Aggr() et Only() dans un tableau sans mesure

Dans un tableau contenant uniquement des dimensions, une dimension calculée peut utiliser Aggr() et Only() pour ne conserver que les valeurs répondant à un critère.

Jeu de contrôle : dossier 101 ouvert, dossier 102 fermé et dossier 103 ouvert. L’expression est utilisée comme dimension calculée et l’option d’affichage des valeurs nulles doit être désactivée.

Only() renvoie le dossier lorsqu’une valeur unique reste possible dans le Set. Pour le dossier fermé, le Set est vide et la dimension renvoie NULL, que le tableau peut masquer.

Exemple

Dimension calculéeAggr(Only({<Statut={'Ouvert'}>} Dossier), Dossier)résultat visible : 101 et 103
101Ouvert → affiché
102Fermé → NULL
103Ouvert → affiché

Aggr() comme dimension calculée

Aggr() peut également servir à produire une dimension calculée issue d’une agrégation, par exemple pour regrouper les clients selon leur nombre de commandes.

C’est utile lorsque la catégorie doit rester dynamique et dépendre des sélections. Si elle est statique, préférez plutôt un champ calculé dans le script.

Une dimension Aggr() peut être puissante, mais surveillez les performances sur un grand nombre de valeurs.

Exemple

IdéeAggr(Count(DISTINCT Commande), Client)créer dynamiquement des groupes de clients selon leur activité
UsageDimension calculée dynamique
BaseAgrégation par entité
AlternativeChamp dans le script si statique

Performances : utiliser Aggr() à bon escient

Aggr() est puissant mais construit un résultat intermédiaire. Plus le nombre de combinaisons dimensionnelles est élevé et plus l’expression interne est complexe, plus le calcul peut devenir coûteux.

Évitez Aggr() pour une simple Sum(), Count(), un sous-total gérable avec TOTAL ou un calcul statique qui pourrait être préparé dans le script.

La meilleure optimisation d’un Aggr() inutile est de le supprimer.

Exemple

RéflexeSimple d’abord → Aggr() si nécessairemesurer les performances avec des volumes réalistes
À éviterAggr() systématique
À vérifierCardinalité des dimensions
À testerTemps de réponse réel

Méthode de débogage

Quand une expression Aggr() ne donne pas le résultat attendu, ne tentez pas de tout corriger en une seule fois. Matérialisez mentalement — ou réellement dans un tableau temporaire — l’étape interne.

Ajoutez les dimensions de l’Aggr() dans un tableau, affichez la mesure interne, contrôlez les sélections et le Set Analysis, puis seulement ensuite vérifiez l’agrégation externe.

Cette méthode transforme souvent un « mystère Aggr() » en problème très simple.

Exemple

Étapes1. dimensions → 2. mesure interne → 3. Set → 4. agrégation externevalider chaque niveau séparément
1Contrôler le grain
2Contrôler la table virtuelle
3Contrôler l’agrégation finale

La checklist SOSBI

Avant de valider un Aggr(), posez-vous six questions : ai-je vraiment deux niveaux d’agrégation ? Quel est le grain intermédiaire ? Mon agrégation interne est-elle correcte ? Quelle agrégation externe veux-je ? Où le Set doit-il agir ? Puis-je faire plus simple ?

Si ces six réponses sont claires, votre expression a de fortes chances d’être à la fois juste, compréhensible et maintenable.

Ne commencez pas par écrire Aggr(). Commencez par décrire les deux étapes du calcul.

Exemple

Formule mentaleBesoin → Grain → Interne → Externe → Set → PerformanceAggr() devient alors une méthode, pas une formule magique
BesoinDeux niveaux ?
GrainUne ligne virtuelle par quoi ?
FinalComment agréger ces lignes ?

Sources et attribution

La documentation Qlik et l’article de Henric Cronström (HIC) sont indiqués comme références techniques. Les formulations, jeux de données et exemples SOSBI ont été rédigés indépendamment et ne constituent pas une traduction de ces sources.