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.
Si le besoin ne comporte qu’un seul niveau d’agrégation, Aggr() est probablement inutile.
Exemple · Le principe en une expression
| Deux niveaux | Max(Aggr(Sum(Montant), Commande)) | 1. total par commande → 2. plus grande commande |
|---|
| Étape 1 | Sum(Montant) par Commande |
|---|---|
| Étape 2 | Max() sur les résultats |
| Résultat | Valeur 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.
Penser « table virtuelle » rend Aggr() beaucoup plus simple à comprendre.
Exemple
| Commande | Sum(Montant) |
|---|---|
| C001 | 450 € |
| C002 | 1 250 € |
| C003 | 780 € |
| Dimension Aggr | Commande |
|---|---|
| Mesure interne | Sum(Montant) |
| Table virtuelle | 1 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.
L’agrégation interne répond à « combien par commande ? » ; l’externe à « laquelle est la plus grande ? ».
Exemple
| Expression | Max(Aggr(Sum(Montant), Commande)) | Sum() calcule chaque commande ; Max() sélectionne la plus élevée |
|---|
| Interne | Sum(Montant) |
|---|---|
| Dimension | Commande |
| Externe | Max() |
Moyenne des commandes
Pour calculer la moyenne des montants de commande, on peut moyenner la liste des totaux calculés par commande.
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 Aggr | Avg des totaux par commande |
|---|---|
| Alternative | Ratio de deux agrégations |
| Choix | Privilé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.
Avant d’écrire Aggr(), dites à voix haute : « je veux une ligne virtuelle par… ».
Exemple
| Expression | Avg(Aggr(Sum(Montant), Produit, Mois)) | moyenne des ventes calculées au grain Produit × Mois |
|---|
| Grain | Produit × Mois |
|---|---|
| Interne | Sum(Montant) |
| Externe | Avg() |
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 résultat étrange avec des NULL ? Vérifiez le grain avant de toucher au Set Analysis.
Exemple
| Correct | Graphique : Année · Aggr : Mois | Aggr() est au même grain ou à un grain plus fin |
|---|
| Graphique | Année |
|---|---|
| Aggr | Mois |
| Règle | Aggr ≥ 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.
Quand vous relisez une expression Aggr(), identifiez systématiquement les deux niveaux.
Exemple
| Bonne structure | Avg(Aggr(Sum(Montant), Client)) | Sum() = interne · Avg() = externe |
|---|
| Interne | Toujours une agrégation |
|---|---|
| Aggr | Produit un tableau de valeurs |
| Externe | Agrè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.
Le Set interne n’hérite pas simplement du contexte de l’agrégation externe : les contextes doivent être compris explicitement.
Exemple
| Exemple | Max({<Annee={2026}>} Aggr(Sum({<Annee={2026}>} Montant), Commande)) | le contexte est explicitement maîtrisé aux deux niveaux |
|---|
| Question 1 | Quand filtrer les lignes source ? |
|---|---|
| Question 2 | Quand filtrer le résultat intermédiaire ? |
| Méthode | Raisonner 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.
Demandez-vous toujours : « à quel moment de mon calcul cette condition doit-elle agir ? ».
Exemple
| Réflexe | Condition sur les données → interne | Condition sur le tableau virtuel / résultat → externe |
|---|
| Interne | Construit la valeur intermédiaire |
|---|---|
| Externe | Choisit/agrège les résultats |
| Décision | Placer 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.
Avant Aggr(), vérifiez toujours si TOTAL, une agrégation standard ou un ratio suffit.
Exemple
| Plus simple | Sum(Montant) / Sum(TOTAL Montant) | pas d’Aggr() pour un simple pourcentage du total |
|---|
| Besoin | Sous-total / total du graphique |
|---|---|
| Outil | TOTAL |
| 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.
Le bon calcul au bon endroit : moteur d’interface pour le dynamique, script pour le stable.
Exemple
| Statique | LOAD Client, Sum(Montant) ... GROUP BY Client | pré-calculer lorsque la valeur n’a pas besoin d’être dynamique |
|---|
| Dynamique | Aggr() peut être pertinent |
|---|---|
| Statique | Pré-calcul dans le modèle |
| Gain | Calcul é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.
Si vous n’avez pas une raison précise d’utiliser NODISTINCT, restez sur le comportement standard.
Exemple
| Syntaxe | Aggr(NODISTINCT Sum(Montant), Client) | ne pas utiliser NODISTINCT « pour essayer » : comprendre d’abord le grain attendu |
|---|
| Défaut | Combinaisons distinctes |
|---|---|
| NODISTINCT | Peut répéter les valeurs |
| Usage | Cas 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.
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 annuelle | Max(Aggr(Sum(CA) - Above(Sum(CA)), (Annee,(NUMERIC,ASCENDING)))) | résultat : 60, entre 2025 et 2026 |
|---|
| Données | 100 · 135 · 120 · 180 |
|---|---|
| Évolutions | +35 · -15 · +60 |
| Résultat | 60 |
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.
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ée | Aggr(Only({<Statut={'Ouvert'}>} Dossier), Dossier) | résultat visible : 101 et 103 |
|---|
| 101 | Ouvert → affiché |
|---|---|
| 102 | Fermé → NULL |
| 103 | Ouvert → 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.
Une dimension Aggr() peut être puissante, mais surveillez les performances sur un grand nombre de valeurs.
Exemple
| Idée | Aggr(Count(DISTINCT Commande), Client) | créer dynamiquement des groupes de clients selon leur activité |
|---|
| Usage | Dimension calculée dynamique |
|---|---|
| Base | Agrégation par entité |
| Alternative | Champ 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.
La meilleure optimisation d’un Aggr() inutile est de le supprimer.
Exemple
| Réflexe | Simple d’abord → Aggr() si nécessaire | mesurer les performances avec des volumes réalistes |
|---|
| À éviter | Aggr() systématique |
|---|---|
| À vérifier | Cardinalité des dimensions |
| À tester | Temps 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.
Cette méthode transforme souvent un « mystère Aggr() » en problème très simple.
Exemple
| Étapes | 1. dimensions → 2. mesure interne → 3. Set → 4. agrégation externe | valider chaque niveau séparément |
|---|
| 1 | Contrôler le grain |
|---|---|
| 2 | Contrôler la table virtuelle |
| 3 | Contrô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 ?
Ne commencez pas par écrire Aggr(). Commencez par décrire les deux étapes du calcul.
Exemple
| Formule mentale | Besoin → Grain → Interne → Externe → Set → Performance | Aggr() devient alors une méthode, pas une formule magique |
|---|
| Besoin | Deux niveaux ? |
|---|---|
| Grain | Une ligne virtuelle par quoi ? |
| Final | Comment 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.