· Par Équipe HeyData

Outer set expressions dans Qlik Sense : un set pour toute l’expression

Un panier moyen 2025 s’écrit traditionnellement ainsi :

Sum({<Year={2025}>} Amount) / Count({<Year={2025}>} DISTINCT Customer)

Le même ensemble, deux fois. Ajoutez une condition sur la région, et il faut la reporter partout, sans en oublier une. Depuis August 2022, Qlik Sense accepte un ensemble placé devant l’expression, qui vaut pour toutes ses agrégations : c’est l’outer set expression. Elle s’applique aussi aux mesures principales et aux variables, et les versions 2025 ont précisé la façon dont plusieurs ensembles s’enchaînent. Tous les résultats de cet article ont été vérifiés dans Qlik Cloud.

Inner ou outer : où placer l’ensemble

L’ensemble classique, entre les parenthèses d’une agrégation, est une inner set expression. Placé devant, il devient une outer set expression :

{<Year={2025}>} Sum(Amount) / Count(DISTINCT Customer)   // → 67,5

Le résultat est le même que la version longue : 270 de ventes pour 4 clients en 2025. Deux règles de syntaxe :

  • l’outer set se place en tête de sa portée, jamais au milieu ;
  • sa portée est toute l’expression, sauf si des parenthèses la limitent.
({<Year={2025}>} Sum(Amount)) / Sum(Amount)   // → 0,397 : part de 2025 dans le total

Ici, seul le numérateur hérite de l’ensemble ; le dénominateur garde la sélection courante, soit 680.

Qui gagne quand l’inner et l’outer se rencontrent ?

Les deux ensembles se combinent, et l’inner a le dernier mot.

En haut, deux expressions avec leur portée soulignée : dans {<Year={2025}>} Sum(Amount) / Count(DISTINCT Customer), les deux agrégations héritent de Year = 2025 ; dans ({<Year={2025}>} Sum(Amount)) / Sum(Amount), seule la parenthèse hérite et le dénominateur garde la sélection. Au milieu, le même champ dans l’inner et l’outer, avec un outer Year = 2025 : Year={2026} remplace et donne 410, Year+={2026} fait l’union et donne 680, Year*={2026} fait l’intersection et donne 0. En bas, un identifiant {1} dans l’inner ignore l’outer set et prend tout l’historique ; un inner sur un autre champ, Product = Shoe, s’ajoute à l’outer et donne Shoe en 2025.

L’outer set fixe le contexte ; l’inner le complète, le modifie ou le remplace.

  • Un identifiant dans l’inner ({1}, {$}, un signet) remplace le contexte de l’outer. {<Year={2025}>} Sum(Amount) / Sum({1} Amount) donne la part de 2025 dans tout l’historique.
  • Pour le même champ dans les deux ensembles : = remplace la valeur de l’outer, += en fait l’union, *= l’intersection.
  • Des champs différents s’additionnent : {<Year={2025}>} Sum({<Product={"Shoe"}>} Amount) donne les ventes de Shoe en 2025, soit 140.
{<Year={2025}>} Sum({<Year={2026}>} Amount)              // → 410 : l'inner remplace
{<Year={2025}>} Sum({<Year+={2026}>} Amount)             // → 680 : union
{<Year={2025,2026}>} Sum({<Year*={2026}>} Amount)        // → 410 : intersection

Une agrégation ne retient qu’une seule inner set. Si vous en écrivez plusieurs, seule la plus à droite compte, sans message d’erreur. Enfin, dans un Aggr(), l’agrégation interne hérite de l’Aggr(), et l’Aggr() hérite de l’outer set : {<Year={2025}>} Sum(Aggr(Sum(Amount), Customer)) donne bien 270.

Plusieurs outer sets à la suite

On peut enchaîner autant d’outer sets que l’on veut. Ils s’appliquent de gauche à droite, chacun héritant du précédent, et, en cas de conflit sur un même champ, le plus à droite l’emporte :

{<Year={2025}>} {<Region={"North"}>} Sum(Amount)   // → 150 : North en 2025
{<Year={2025}>} {<Year={2026}>} Sum(Amount)        // → 410 : 2026 l'emporte

L’intérêt apparaît avec les variables : un ensemble « période » et un ensemble « périmètre », définis séparément, se combinent en les posant l’un derrière l’autre.

Le piège de l’ensemble vide, et le drapeau &

Un ensemble peut être vide : une valeur qui n’existe pas (Year={2024} dans nos données), une sélection de l’utilisateur incompatible, ou un {<Year={}>} explicite. Seul, il donne logiquement 0. Mais quand un autre ensemble le suit, Qlik efface la sélection vide de ce champ avant d’appliquer la suite. Le résultat surprend :

Deux expressions. La première, {<Year={2024}>} {<Region={"North"}>} Sum(Amount) : Year = 2024 n’existe pas, l’ensemble vide est effacé et le résultat porte sur North toutes années, 350. La seconde, avec le drapeau & en tête, {&<Year={2024}>} {<Region={"North"}>} Sum(Amount) : l’ensemble vide est conservé, aucune ligne ne correspond, le résultat est 0.

Sans le drapeau, une année inexistante revient à « toutes les années ».

{<Year={2024}>} Sum(Amount)                         // → 0
{<Year={2024}>} {<Region={"North"}>} Sum(Amount)    // → 350 : Year vide effacé
{&<Year={2024}>} {<Region={"North"}>} Sum(Amount)   // → 0 : ensemble vide conservé

L’effacement ne touche que le champ vide : la région, elle, est bien appliquée. Il se produit aussi quand l’ensemble vide est suivi d’une inner set : {<Year={2024}>} Sum({<Region={"North"}>} Amount) donne également 350.

Le drapeau &, placé juste après l’accolade ouvrante, conserve l’ensemble vide. Il vaut pour une expression qui compte au moins deux outer sets, ou un outer et un inner. Dès que l’une des valeurs d’un ensemble vient d’une variable ou d’une sélection, il vaut mieux le mettre : un 0 se remarque, un total faux beaucoup moins.

Outer set et expansion dollar

Une variable se combine naturellement avec un outer set… à condition de savoir ce que l’expansion insère. Car l’expansion dollar a lieu avant le calcul : Qlik remplace $(…) par son résultat, puis évalue l’expression obtenue.

Deux colonnes. À gauche, une variable sans signe égal : SET vSales = Sum(Amount) ; l’expression {<Year={2025}>} $(vSales) devient, après l’expansion, le texte {<Year={2025}>} Sum(Amount), et le calcul donne 270 : l’outer set s’applique. À droite, une variable avec signe égal : SET vSalesCalc = =Sum(Amount) ; l’expansion insère la valeur déjà calculée, {<Year={2025}>} 680, et le calcul donne 680 : l’outer set est sans effet.

Une variable qui contient une formule hérite de l’ensemble ; une variable qui contient un résultat, non.

SET vSales = Sum(Amount);       // la formule
SET vSalesCalc = =Sum(Amount);  // le résultat, calculé à part

{<Year={2025}>} $(vSales)        // → 270
{<Year={2025}>} $(vSalesCalc)    // → 680 : l'outer set ne voit qu'un nombre
{<Year={2025}>} $(=Sum(Amount))  // → 680, pour la même raison

La règle tient en une phrase : l’outer set ne s’applique qu’aux agrégations qui figurent dans le texte après l’expansion. Une variable dont la définition commence par = est calculée seule, sur la sélection courante, et n’insère qu’un nombre. L’aide Qlik signale une variante : une expansion qui produit du texte, comme $(='Sum(' & 'Amount' & ')'), insère Sum(Amount), et l’outer set s’applique.

Un outer set devant une mesure principale

Depuis February 2021, une expression peut appeler une mesure principale par son nom, entre crochets. Depuis August 2022, un outer set peut la précéder :

[Sales]                    // → 680 : la mesure principale Sales = Sum(Amount)
{<Year={2025}>} [Sales]    // → 270
{<Year={2026}>} [Sales]    // → 410

C’est la combinaison la plus utile en pratique. La règle de calcul reste définie une seule fois, dans la bibliothèque, et chaque graphique la décline par période ou par périmètre, sans créer de mesure « Ventes 2025 », « Ventes 2026 », « Ventes N-1 ».

Tableau Qlik Sense par région. Colonnes : Sales, {<Year={2025}>} [Sales] et {<Year={2026}>} [Sales]. Totaux : 680, 270 et 410. North : 350, 150 et 200. South : 260, 80 et 180. East : 70, 40 et 30.

Une seule mesure principale, déclinée par année avec un outer set (capture Qlik Cloud).

Deux limites, documentées par Qlik. Si la mesure principale est renommée ou supprimée, les expressions qui l’appellent ne sont pas mises à jour et renvoient NULL. Et le format de nombre, la couleur et le libellé de la mesure ne suivent pas : on les règle dans le graphique. Évitez enfin de donner à une mesure le nom d’un champ ou d’une variable.

Ce qui change dans vos applications

  • Des expressions plus courtes. Un ratio, une marge ou un taux s’écrivent avec un seul ensemble.
  • Une bibliothèque plus petite. Une mesure principale par règle de gestion, déclinée par outer set.
  • Des ensembles composables. Une variable de période et une variable de périmètre, enchaînées.
  • Deux réflexes. Vérifier la portée des parenthèses, et préférer des variables sans = devant un outer set.

Les outer sets et leur application aux mesures principales sont disponibles dans toutes les éditions depuis August 2022. Les chaînes d’ensembles, l’effacement implicite et le drapeau & sont documentés dans l’aide client-managed à partir de May 2025 ; dans Qlik Cloud, ils fonctionnaient dès la fin de 2024, d’après une réponse du support Qlik relayée sur Qlik Community.

À retenir

  • Un set pour toute l’expression. {<…>} devant l’expression vaut pour toutes ses agrégations.
  • Les parenthèses bornent la portée. Et l’outer set se place toujours en tête.
  • L’inner a le dernier mot. Un identifiant remplace le contexte ; =, +=, *= remplacent, unissent ou croisent.
  • De gauche à droite. Dans une chaîne d’outer sets, le plus à droite l’emporte.
  • Le drapeau & contre l’ensemble vide. Sans lui, un ensemble vide suivi d’un autre est effacé.
  • Des variables sans =. Seul le texte inséré hérite de l’outer set.

Essayer dans Qlik Sense

Collez ce script dans l’éditeur de chargement de données d’une application vide et rechargez. Créez ensuite une mesure principale nommée Sales, d’expression Sum(Amount). Les expressions à essayer, dans des indicateurs ou une table, sont en commentaire.

// Outer set expressions : script d'essai (HeyData)
Sales:
LOAD * INLINE [
Region, Year, Product, Customer, Amount
North, 2025, Shoe, A, 100
North, 2025, Hat, B, 50
North, 2026, Shoe, A, 200
South, 2025, Bag, C, 80
South, 2026, Hat, C, 120
South, 2026, Shoe, D, 60
East, 2025, Shoe, E, 40
East, 2026, Bag, E, 30
];

SET vSales = Sum(Amount);
SET vSalesCalc = =Sum(Amount);

// Sans sélection :
//   Sum({<Year={2025}>} Amount) / Count({<Year={2025}>} DISTINCT Customer)  → 67,5
//   {<Year={2025}>} Sum(Amount) / Count(DISTINCT Customer)                  → 67,5
//   ({<Year={2025}>} Sum(Amount)) / Sum(Amount)                             → 0,397
//   {<Year={2025}>} Sum(Amount) / Sum({1} Amount)                           → 0,397
//   {<Year={2025}>} Sum({<Year={2026}>} Amount)                             → 410
//   {<Year={2025}>} Sum({<Year+={2026}>} Amount)                            → 680
//   {<Year={2025,2026}>} Sum({<Year*={2026}>} Amount)                       → 410
//   {<Region={"North","South"}>} Sum({<Region*={"South","East"}>} Amount)   → 260
//   {<Year={2025}>} Sum({<Product={"Shoe"}>} Amount)                        → 140
//   {<Year={2025}>} {<Region={"North"}>} Sum(Amount)                        → 150
//   {<Year={2025}>} {<Year={2026}>} Sum(Amount)                             → 410
//   {<Year={2024}>} Sum(Amount)                                             → 0
//   {<Year={2024}>} {<Region={"North"}>} Sum(Amount)                        → 350
//   {&<Year={2024}>} {<Region={"North"}>} Sum(Amount)                       → 0
//   {<Year={2025}>} $(vSales)                                               → 270
//   {<Year={2025}>} $(vSalesCalc)                                           → 680
//   {<Year={2025}>} [Sales]                                                 → 270
//   {<Year={2025}>} Sum(Aggr(Sum(Amount), Customer))                        → 270

Sources

Pour revoir les bases et les fonctions P() et E(), lisez notre article sur le set analysis avancé, et pour les variables, celui sur l’expansion dollar.