BIENVENUE
Introduction
Sum(Montant)Avant de filtrer un ensemble, partons de l’agrégation classique : Qlik additionne Montant dans le contexte des sélections courantes.
Le résultat dépend uniquement des sélections actives de l’utilisateur.
TUTORIEL · QLIK SENSE
35 exemples progressifs, du premier filtre aux recherches avancées, historique de sélection, ensembles naturels et syntaxe externe.
Certains concepts avancés de ce tutoriel s’appuient sur les travaux pédagogiques de Henric Cronström (HIC), notamment sur ses articles consacrés au Set Analysis. Les explications, formulations et exemples présentés sur SOSQLIK ont été réécrits et adaptés en français ; ils ne constituent pas une traduction des articles originaux.
BIENVENUE
Sum(Montant)Avant de filtrer un ensemble, partons de l’agrégation classique : Qlik additionne Montant dans le contexte des sélections courantes.
Le résultat dépend uniquement des sélections actives de l’utilisateur.
EXEMPLE 1
Sum({<Annee={2026}>} Montant)Le modificateur impose Annee = 2026. Les autres sélections de l’utilisateur restent actives.
Cette expression calcule la somme des Montants uniquement pour l’année 2026, même si l’utilisateur a sélectionné d’autres années dans son application.
EXEMPLE 2
Sum({<Annee={2025,2026}>} Montant)La liste entre accolades sélectionne plusieurs valeurs possibles du même champ.
La somme porte sur les lignes appartenant à 2025 ou 2026, tout en conservant les autres sélections actives.
EXEMPLE 3
Sum({<Region-={'Sud'}>} Montant)L’opérateur -= retire une valeur de l’ensemble au lieu de la sélectionner.
Toutes les régions compatibles avec le contexte courant sont prises en compte sauf la région Sud.
EXEMPLE 4
Sum({<Annee=>} Montant)Un champ suivi de = sans valeur efface la sélection de ce champ dans le calcul.
Le calcul ignore toute sélection faite sur Annee, mais continue de respecter les sélections sur les autres champs.
EXEMPLE 5
Sum({1} Montant)L’identifiant d’ensemble 1 représente l’ensemble complet des données, indépendamment de la sélection courante.
La somme est calculée sur toutes les données disponibles dans le modèle, sans tenir compte des sélections utilisateur.
EXEMPLE 6
Sum({<Montant={">=1000"}>} Montant)Une chaîne de recherche permet d’utiliser des opérateurs de comparaison dans le modificateur.
Seuls les enregistrements dont Montant est supérieur ou égal à 1000 participent à la somme.
EXEMPLE 7
Sum({<Annee={2026}>} Montant)Avant de choisir des quotes, posez-vous une question simple : la valeur manipulée est-elle numérique, textuelle, ou s’agit-il d’une recherche ? Ici, Annee est un champ numérique et 2026 est une valeur numérique. On écrit donc 2026 sans quotes.
Le piège est de se fier uniquement à ce qui est affiché à l’écran. Deux valeurs peuvent toutes les deux apparaître comme 2026 tout en n’ayant pas le même type dans le modèle Qlik. La syntaxe du Set doit refléter la nature réelle de la valeur.
EXEMPLE 8
Sum({<Region={'Sud'}>} Montant)Sud est ici une valeur textuelle précise : un littéral. La bonne habitude consiste à l’entourer de simples quotes. Même lorsqu’un texte ne contient ni espace, ni accent, ni caractère spécial, les simples quotes rendent immédiatement visible qu’il s’agit d’une valeur texte exacte.
Règle SOSQLIK : pour un littéral texte, écrivez les simples quotes systématiquement. Cette convention évite les ambiguïtés, améliore la lecture des expressions et suit la distinction pédagogique mise en avant par HIC entre littéraux et recherches.
EXEMPLE 9
Sum({<CodeAnnee={'2026'}>} Montant)Un champ peut contenir un code composé uniquement de chiffres tout en étant textuel. CodeAnnee peut par exemple contenir la chaîne de caractères 2026, alors que le champ Annee contient le nombre 2026. Visuellement, la différence est invisible ; dans le modèle, elle peut être importante.
Ne transformez donc pas automatiquement {2026} en {'2026'} ou l’inverse. Pour Annee numérique, utilisez {2026}. Pour CodeAnnee textuel, utilisez {'2026'}. En cas de doute, vérifiez comment le champ est construit ou chargé.
EXEMPLE 10
Dès que l’on utilise * ou ?, on ne désigne plus un littéral exact : on demande à Qlik d’effectuer une recherche dans les valeurs du champ. C’est pourquoi les motifs de recherche sont écrits entre doubles quotes.
Les quatre cas ci-dessous montrent comment placer * ou ? selon ce que l’on cherche. L’objectif n’est pas de mémoriser quatre syntaxes différentes, mais de comprendre ce que représente chaque wildcard.
Sum({<Produit={"PC-*"}>} Montant)Le motif "PC-*" retient toutes les valeurs qui commencent par PC-. L’astérisque accepte ensuite zéro, un ou plusieurs caractères.
Sum({<Produit={"*PORTABLE*"}>} Montant)Avec un astérisque de chaque côté, Qlik recherche PORTABLE n’importe où dans la valeur. PC-PORTABLE-14 et PC-PORTABLE-16 correspondent au motif.
Sum({<Produit={"*-16"}>} Montant)Ici, * est placé au début : la partie précédente peut varier, mais la valeur doit se terminer par -16. PC-PORTABLE-16 et TEL-IPHONE-16 sont donc retenus.
Sum({<Produit={"PC-PORTABLE-1?"}>} Montant)Le ? remplace exactement un caractère. PC-PORTABLE-14 et PC-PORTABLE-16 correspondent ; PC-PORTABLE-100 ne correspond pas. * accepte une longueur variable, ? une longueur d’un seul caractère.
* représente zéro, un ou plusieurs caractères ; ? représente exactement un caractère.
Dans les deux cas, le motif est une chaîne de recherche : on utilise donc les doubles quotes.
EXEMPLE 11
Sum({$<Region=>} Montant)Ces deux écritures se ressemblent énormément, mais elles ne demandent pas la même chose à Qlik. Avec <Region=>, on retire la sélection du champ Region pour ce calcul : Region ne filtre plus le résultat. Avec <Region={}>, on définit au contraire une liste de valeurs vide pour Region.
À retenir : <Champ=> signifie « ne tiens pas compte de la sélection sur ce champ ». <Champ={}> signifie « aucune valeur pour ce champ ». Une paire d’accolades en plus change donc complètement le sens du Set.
EXEMPLE 12
Sum({$<Produit+={'PC'}>} Montant)Dans un modificateur, = remplace la sélection du champ par les valeurs indiquées. Les opérateurs implicites +=, -= et *= travaillent au contraire à partir de la sélection déjà présente : += ajoute, -= retire et *= conserve uniquement l’intersection.
Ici, Produit+='PC' ajoute PC aux produits déjà sélectionnés. C’est très différent de Produit={'PC'}, qui remplace la sélection du champ Produit par PC. Avant d’utiliser +=, -= ou *=, demandez-vous donc si votre calcul doit partir de la sélection courante.
EXEMPLE 13
Sum({$<Annee={">=2020<=2026"}>} Montant)Les doubles quotes indiquent une recherche, pas nécessairement une recherche textuelle avec un wildcard. Elles permettent aussi d’exprimer une condition numérique. Ici, Qlik recherche dans Annee toutes les valeurs comprises entre 2020 et 2026 inclus.
Cela complète la règle vue précédemment : {2026} désigne la valeur numérique 2026 ; {'2026'} désigne un littéral texte ; {">=2020<=2026"} est une recherche numérique. Ce sont trois intentions différentes et la syntaxe doit les rendre visibles.
EXEMPLE 14
Sum({$<Client={"=Sum(Montant)>100000"}>} Montant)Une recherche peut commencer par = et contenir une expression Qlik. La condition est alors évaluée pour les valeurs du champ recherché. Ici, on ne choisit pas les clients par leur nom : on recherche les clients pour lesquels Sum(Montant) dépasse 100 000.
C’est extrêmement puissant, mais à utiliser avec discernement : le résultat dépend du contexte dans lequel l’expression de recherche est évaluée. Pour SOSQLIK, la bonne pratique est de réserver cette syntaxe aux besoins réellement dynamiques et de documenter clairement la condition métier.
EXEMPLE 15
Sum({$1} CA)$ représente la sélection courante. $1 représente l’état de sélection précédent ; $2 remonte encore d’un cran. À l’inverse, $_1 désigne l’état suivant lorsqu’il existe dans l’historique. Ces identificateurs permettent de comparer un calcul avant et après une modification de sélection.
Exemple : l’utilisateur avait sélectionné Fournisseur = NovaTech, puis ajoute Produit = PC-PORTABLE. Sum({$1} CA) permet de recalculer le CA dans l’état précédent, avant cette dernière modification. À utiliser lorsque la comparaison avec l’historique de sélection a un vrai sens métier.
EXEMPLE 16
Sum({Comparatif} CA)Un identificateur de Set ne se limite pas à $ ou 1. Un favori enregistré ou un Alternate State nommé peut aussi fournir le contexte de départ d’une expression. C’est particulièrement utile pour comparer deux populations ou deux scénarios sans modifier la sélection principale.
Imaginons un Alternate State nommé Comparatif dans lequel on sélectionne Fournisseur = DigiPro. Sum({Comparatif} CA) calcule le CA de cet état, indépendamment de la sélection courante. Avec un favori, le principe est similaire : le favori fournit un ensemble enregistré que l’expression peut réutiliser.
EXEMPLE 17
Sum({$<Produit={'PC-PORTABLE'}>} CA)C’est une subtilité essentielle : un modificateur de Set modifie le périmètre de calcul à partir de son ensemble de départ ; il ne simule pas une nouvelle série de clics dans les filtres. Les autres sélections compatibles ou incompatibles restent donc déterminantes.
Si la sélection courante contient Client = Alpha et qu’Alpha n’a jamais acheté PC-PORTABLE, imposer Produit={'PC-PORTABLE'} ne va pas automatiquement remplacer Alpha par les clients qui achètent ce produit. L’intersection peut simplement devenir vide et retourner 0. Pour repartir d’un autre contexte, il faut le dire explicitement dans le Set.
EXEMPLE 18
Sum({$<Annee={2026}, Trimestre=, Mois=, Date=>} CA)Fixer Annee={2026} ne signifie pas forcément « toute l’année 2026 ». Si l’utilisateur a aussi sélectionné un mois, un trimestre ou une date, ces sélections continuent à restreindre le calcul. C’est l’un des pièges les plus fréquents des Sets temporels.
Pour calculer réellement le CA de toute l’année 2026, on impose Annee={2026} et on neutralise explicitement Trimestre, Mois et Date. Exemple : si Mars était sélectionné, Sum({$<Annee={2026}>} CA) peut ne calculer que mars 2026 ; la version ci-dessus restitue bien l’année complète.
EXEMPLE 19
Sum({<Annee={$(=Max(Annee))}>} Montant)La Dollar-sign expansion évalue Max(Annee) avant que le Set Analysis ne soit appliqué.
Le calcul utilise automatiquement l’année maximale disponible dans le contexte d’évaluation.
EXEMPLE 20
Sum({<Date={">=$(=MonthStart(Max(Date)))<=$(=Max(Date))"}>} Montant)La recherche délimite ici une plage dynamique allant du début du mois de la date maximale jusqu’à cette date maximale.
Le résultat correspond au cumul du mois courant jusqu’à la dernière date disponible dans le contexte.
EXEMPLE 21
Sum({<Client=P({<Produit={'A'}>} Client)>} Montant)P() renvoie les valeurs possibles d’un champ dans un ensemble. Ici, on récupère les clients possibles lorsqu’on impose Produit=A.
La somme porte sur les Montants des clients ayant acheté le produit A. Ces clients peuvent ensuite être évalués sur l’ensemble du contexte externe.
EXEMPLE 22
Sum({<Client=E({<Produit={'A'}>} Client)>} Montant)E() fait l’inverse de P() : elle renvoie les valeurs exclues du champ dans l’ensemble indiqué.
Le calcul cible les clients exclus lorsque Produit=A — autrement dit ceux qui ne sont pas associés à A dans cet ensemble.
EXEMPLE 23
Sum({<Client=P({<Produit={'A'}>} Client)*P({<Produit={B}>} Client)>} Montant)* = intersection. On ne garde que la partie commune à A et B. Imagine deux cercles : seule leur zone de chevauchement reste.
A * B = A ET B. Exemple : A = Lucas, Sonia, Abdel ; B = Sonia, Abdel, Tristan ; résultat = Sonia et Abdel.
EXEMPLE 24
Sum({<Client=P({<Produit={'A'}>} Client)-P({<Produit={B}>} Client)>} Montant)- = différence. On part de A et on retire ce qui appartient aussi à B. Attention : A-B n’est pas B-A.
A - B = A mais PAS B. Exemple : A = Serge, Sophie, Vincent ; B = Vincent, Karine ; résultat = Serge et Sophie.
EXEMPLE 25
Sum({$+1<Annee={2026}>} Montant)+ = union. On rassemble tout ce qui appartient à A OU à B.
A + B = A OU B. À retenir : + rassemble, * croise, - retire et / garde ce qui est exclusif à l’un ou l’autre.
EXEMPLE 26
Sum({$/1<Annee={2026}>} Montant)/ = différence symétrique. On garde ce qui appartient à A ou à B, mais pas ce qui appartient aux deux à la fois.
A / B = A OU B mais PAS les deux. Exemple : A = Dudu, Dédé, Martial ; B = Martial, Karine, Tristan ; résultat = Dudu, Dédé, Karine et Tristan.
EXEMPLE 27
Avg(Aggr(Sum({<Annee={2026}>} Montant), Client))Aggr() crée une agrégation intermédiaire par Client. Le Set Analysis est appliqué à la somme interne avant le calcul de la moyenne.
On obtient la moyenne des montants 2026 agrégés par client, plutôt que la moyenne brute des lignes.
EXEMPLE 28
Sum({$-<Client={'X'}>} Montant)HIC distingue les ensembles naturels, que l’on peut reproduire par une sélection, des ensembles non naturels, construits au niveau des enregistrements avec des opérateurs d’ensemble. Cette distinction devient importante dès que NULL ou des combinaisons d’ensembles entrent en jeu.
Dans cet exemple adapté pour SOSQLIK, on retire de l’ensemble courant les enregistrements associés au client X. Selon le modèle, des enregistrements dont Client est NULL peuvent rester dans le résultat, alors qu’un NULL ne peut pas être sélectionné directement dans une liste.
EXEMPLE 29
P({1<Produit={'A'}>} Client)Le conseil essentiel de HIC : P() et E() doivent travailler avec des ensembles naturels, car ces fonctions doivent retourner un ensemble de valeurs de champ. Un ensemble non naturel ne possède pas toujours un ensemble de valeurs de champ bien défini.
À retenir : seuls les ensembles naturels peuvent être recréés comme sélections interactives, stockés dans des favoris, modifiés de façon fiable et utilisés à l’intérieur de P() et E().
EXEMPLE 30
{<Annee={2026}>} Sum(Montant)Depuis Qlik Sense August 2022, un Set peut aussi être placé au début d’une portée d’expression, donc à l’extérieur de la fonction d’agrégation. HIC souligne que cette écriture évite de répéter le même Set dans chaque agrégation.
Le Set externe devient le contexte des agrégations qui suivent dans sa portée. C’est particulièrement utile pour réutiliser une mesure principale sans y coder le filtre en dur.
EXEMPLE 31
{<Annee={2026}>} Sum(CA) / Count(DISTINCT Commande)Avec l’ancienne écriture, il faudrait répéter le Set dans Sum() puis dans Count(). Le Set externe définit ici une seule fois le contexte 2026 pour les deux agrégations.
La formule calcule le chiffre d’affaires moyen par commande en 2026. Cette syntaxe rend les expressions longues plus lisibles et réduit les duplications.
EXEMPLE 32
({<Annee={2026}>} Sum(CA) / Count(Commande)) - Avg(Objectif)HIC insiste sur la portée lexicale : les parenthèses peuvent limiter la zone affectée par un Set externe. Le Set doit être placé au début de la portée qu’il doit contrôler.
Ici, le contexte Annee=2026 ne s’applique qu’au calcul entre parenthèses. Avg(Objectif), placé après la parenthèse, reste évalué dans son propre contexte.
EXEMPLE 33
{<Annee={2026}>} Sum({<Region={'PACA'}>} Montant)Un Set interne qui ne contient qu’un modificateur hérite du contexte externe. HIC oppose ce cas à un Set interne qui contient son propre identifiant d’ensemble : celui-ci repart alors du contexte défini par cet identifiant.
Ici, le Set interne hérite de Annee=2026 et ajoute Region=PACA. En revanche, un Set interne commençant par 1 ou $ impose son propre point de départ.
EXEMPLE 34
{<Annee={2026}>} Avg(Aggr(Sum(Montant), Client))Point subtil relevé par HIC : le Set d’une agrégation externe n’est pas automatiquement hérité par l’agrégation interne d’un Aggr(). En revanche, un Set placé à l’extérieur de l’agrégation externe peut être hérité par les deux niveaux.
Cette écriture place Annee=2026 au niveau externe de la portée : le contexte peut ainsi s’appliquer à Avg() et au calcul interne utilisé par Aggr().
EXEMPLE 35
Sum({<Annee={$(=Max(Annee))}>} Montant)Une bonne expression doit rester compréhensible : noms de champs explicites, variables documentées et logique d’ensemble découpée lorsqu’elle devient complexe.
Commencez simple, validez chaque ensemble séparément, puis composez l’expression finale. P() et E() sont puissants, mais gagnent à être accompagnés d’une explication métier.