TUTORIEL · QLIK SENSE
Comprendre le Set Analysis
34 exemples progressifs, du premier filtre aux recherches avancées, historique de sélection, ensembles naturels et syntaxe externe.
Introduction
Avant de filtrer un ensemble, partons de l’agrégation classique : Qlik additionne Montant dans le contexte des sélections courantes.
Sum(Montant)Le résultat dépend uniquement des sélections actives de l’utilisateur.
| Sélection courante | Annee = 2026 · Region = PACA |
|---|---|
| Calcul | Sum(Montant) |
| Repère | Sans Set Analysis, le contexte courant décide du périmètre. |
Filtrer sur une valeur
Le modificateur impose Annee = 2026. Les autres sélections de l’utilisateur restent actives.
Sum({<Annee={2026}>} Montant)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.
| Sélection imposée | Annee = 2026 |
|---|---|
| Autres sélections | Conservées |
| Effet | La somme ne porte que sur 2026. |
Filtrer sur plusieurs valeurs
La liste entre accolades sélectionne plusieurs valeurs possibles du même champ.
Sum({<Annee={2025,2026}>} Montant)La somme porte sur les lignes appartenant à 2025 ou 2026, tout en conservant les autres sélections actives.
| Valeurs retenues | 2025 et 2026 |
|---|---|
| Logique | 2025 OU 2026 |
| Effet | Les deux années participent au même calcul. |
Exclure une valeur
L’opérateur -= retire une valeur de l’ensemble au lieu de la sélectionner.
Sum({<Region-={'Sud'}>} Montant)Le calcul retire Sud des valeurs de Region présentes dans l’ensemble de départ. Les autres sélections restent prises en compte.
| Contexte | Toutes les régions possibles |
|---|---|
| Valeur retirée | Sud |
| Effet | Le Sud est exclu du calcul. |
Ignorer une sélection
Un champ suivi de = sans valeur efface la sélection de ce champ dans le calcul.
Sum({<Annee=>} Montant)Le calcul ignore toute sélection faite sur Annee, mais continue de respecter les sélections sur les autres champs.
| Sélection utilisateur | Annee = 2024 |
|---|---|
| Champ neutralisé | Annee |
| Effet | Le calcul devient indépendant de la sélection Annee. |
Ignorer toutes les sélections
L’identifiant d’ensemble 1 représente l’ensemble complet des données, indépendamment de la sélection courante.
Sum({1} Montant)La somme est calculée sur toutes les données disponibles dans le modèle, sans tenir compte des sélections utilisateur.
| Sélections actives | Ignorées |
|---|---|
| Identifiant | 1 |
| Effet | Le calcul porte sur l’ensemble complet des données. |
Recherche et comparaison
Une chaîne de recherche permet d’utiliser des opérateurs de comparaison dans le modificateur.
Sum({<Montant={">=1000"}>} Montant)Seuls les enregistrements dont Montant est supérieur ou égal à 1000 participent à la somme.
| Condition | Montant >= 1 000 |
|---|---|
| Exemples inclus | 1 250 · 2 310 |
| Effet | Les montants inférieurs à 1 000 sont écartés. |
Valeur numérique : écrire un littéral sans quotes
Pour désigner une année précise, Annee={2026} utilise une valeur littérale non entourée de quotes. Ce choix est lisible pour un champ Année, mais les quotes ne constituent pas à elles seules une déclaration de type dans Qlik.
Sum({<Annee={2026}>} Montant)Qlik recherche une valeur dans le champ Annee. Le type effectif dépend du modèle de données, pas uniquement de la présence ou de l’absence de quotes dans le Set.
| Champ | Annee |
|---|---|
| Valeur explicite | 2026 sans quotes |
| Repère | Vérifier le contenu du champ ; les quotes ne fixent pas son type. |
Littéral texte : utiliser les simples quotes
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.
Sum({<Region={'Sud'}>} Montant)Règle SOSBI : 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.
| Nature du champ | Region textuel |
|---|---|
| Valeur exacte | 'Sud' |
| Repère | Un littéral texte s’écrit avec des simples quotes, même sans espace ni accent. |
2026 et '2026' : deux écritures à distinguer
Un code composé de chiffres peut être stocké comme texte, comme nombre ou comme valeur duale dans Qlik. Les simples quotes indiquent ici une correspondance littérale exacte et sensible à la casse, pas une conversion forcée du champ en texte.
Sum({<CodeAnnee={'2026'}>} Montant)Les écritures {2026} et {'2026'} peuvent correspondre à la même valeur affichée. La différence principale porte ici sur la manière de rechercher la valeur : les simples quotes expriment une correspondance littérale exacte. Vérifiez les valeurs réelles du champ et testez l’expression dans l’application.
| Valeur explicite | Annee={2026} |
|---|---|
| Correspondance exacte | CodeAnnee={'2026'} |
| Repère | Les quotes précisent le mode de correspondance, pas à elles seules le type stocké. |
Rechercher avec les wildcards * et ?
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.
Commence par
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.
Contient
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.
Se termine par
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.
Un seul caractère
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.
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.
| Données | PC-PORTABLE-14 · PC-PORTABLE-16 · PC-ECRAN-27 · TEL-IPHONE-16 |
|---|---|
| Wildcards | * = longueur variable · ? = un caractère |
| Repère | Les doubles quotes signalent une recherche, pas un littéral exact. |
<Champ=> ou <Champ={}> : attention au piège
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.
Sum({$<Region=>} Montant)<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.
| Sélection active | Region = Sud |
|---|---|
| Avec <Region=> | La sélection Region est neutralisée |
| Avec <Region={}> | Aucune valeur Region n’est retenue : ce n’est pas la même chose. |
=, +=, -= et *= : remplacer ou modifier la sélection
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.
Sum({$<Produit+={'PC'}>} Montant)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.
| Sélection Produit | ECRAN |
|---|---|
| Produit+={'PC'} | ECRAN + PC |
| Repère | = remplace ; += ajoute ; -= retire ; *= intersecte avec la sélection courante. |
Recherche numérique : les doubles quotes ne servent pas qu’au texte
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.
Sum({$<Annee={">=2020<=2026"}>} Montant)Cela complète la distinction entre valeurs littérales et recherches : {2026} désigne une valeur explicite, {'2026'} une correspondance littérale exacte et {">=2020<=2026"} une recherche numérique bornée.
| Champ | Annee numérique |
|---|---|
| Recherche | >=2020 et <=2026 |
| Résultat | Toutes les années de 2020 à 2026 incluses sont retenues. |
Recherche par expression : filtrer selon un calcul
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.
Sum({$<Client={"=Sum(Montant)>100000"}>} Montant)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 SOSBI, la bonne pratique est de réserver cette syntaxe aux besoins réellement dynamiques et de documenter clairement la condition métier.
| Champ recherché | Client |
|---|---|
| Condition | Sum(Montant) > 100 000 |
| Résultat | Seuls les clients répondant au critère calculé sont retenus. |
$1 et $_1 : exploiter l’historique des sélections
$ 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.
Sum({$1} CA)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.
| État courant | Fournisseur = NovaTech + Produit = PC-PORTABLE |
|---|---|
| État $1 | Fournisseur = NovaTech |
| Usage | Comparer le CA avant et après la dernière modification de sélection. |
Favoris et Alternate States peuvent identifier un ensemble
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.
Sum({Comparatif} CA)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.
| État nommé | Comparatif |
|---|---|
| Sélection dans cet état | Fournisseur = DigiPro |
| Effet | Le CA est calculé dans ce contexte nommé, pas dans la sélection courante. |
Un Set Analysis ne rejoue pas les clics de l’utilisateur
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.
Sum({$<Produit={'PC-PORTABLE'}>} CA)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.
| Sélection courante | Client = Alpha |
|---|---|
| Set imposé | Produit = PC-PORTABLE |
| Piège | Si Alpha n’achète pas ce produit, le résultat peut être vide : Qlik ne resélectionne pas d’autres clients. |
Année, trimestre, mois : penser à neutraliser les champs temporels liés
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.
Sum({$<Annee={2026}, Trimestre=, Mois=, Date=>} CA)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.
| Objectif | CA de toute l’année 2026 |
|---|---|
| Sélection utilisateur | Mois = Mars |
| Solution | Fixer Annee=2026 et neutraliser Trimestre, Mois et Date. |
Variable et Dollar-sign expansion
La Dollar-sign expansion évalue Max(Annee) avant que le Set Analysis ne soit appliqué.
Sum({<Annee={$(=Max(Annee))}>} Montant)Le calcul utilise automatiquement l’année maximale disponible dans le contexte d’évaluation.
| Années disponibles | 2024 · 2025 · 2026 |
|---|---|
| Max(Annee) | 2026 |
| Effet | L’expression s’adapte automatiquement à l’année maximale. |
Gérer une période de dates
La recherche délimite ici une plage dynamique allant du début du mois de la date maximale jusqu’à cette date maximale.
Sum({<Date={">=$(=MonthStart(Max(Date)))<=$(=Max(Date))"}>} Montant)Le résultat correspond au cumul du mois de la date maximale jusqu’à cette date, sous réserve du format numérique utilisé par le champ Date.
| Dernière date | 12/09/2026 |
|---|---|
| Période calculée | 01/09/2026 → 12/09/2026 |
| Effet | Le cumul couvre le début du mois jusqu’à la date maximale. |
Fonction P() — valeurs possibles
P() renvoie les valeurs possibles d’un champ dans un ensemble. Ici, on récupère les clients possibles lorsqu’on impose Produit=A.
Sum({<Client=P({1<Produit={'A'}>} Client)>} Montant)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.
| Produit recherché | A |
|---|---|
| Clients possibles | Alice · Karim · Léa |
| Effet | P() réutilise ces clients dans le Set externe. |
Fonction E() — valeurs exclues
E() fait l’inverse de P() : elle renvoie les valeurs exclues du champ dans l’ensemble indiqué.
Sum({<Client=E({1<Produit={'A'}>} Client)>} Montant)Le calcul cible les clients exclus lorsque Produit=A — autrement dit ceux qui ne sont pas associés à A dans cet ensemble.
| Produit recherché | A |
|---|---|
| Clients exclus | Marc · Nina |
| Effet | E() cible les clients non possibles pour A. |
Intersection — A * B
* = intersection. On ne garde que la partie commune à A et B. Imagine deux cercles : seule leur zone de chevauchement reste.
Sum({<Client=P({1<Produit={'A'}>} Client)*P({1<Produit={'B'}>} Client)>} Montant)- Clients de A
- Lucas · Sonia · Abdel
- Clients de B
- Sonia · Abdel · Tristan
- Résultat
- Sonia · Abdel — présents dans les deux ensembles.
Différence — A - B
- = différence. On part de A et on retire ce qui appartient aussi à B. Attention : A-B n’est pas B-A.
Sum({<Client=P({1<Produit={'A'}>} Client)-P({1<Produit={'B'}>} Client)>} Montant)- Clients de A
- Serge · Sophie · Vincent
- Clients de B
- Vincent · Karine
- Résultat
- Serge · Sophie — A sans les clients de B.
Union — A + B
+ = union. On rassemble tout ce qui appartient à A OU à B.
Sum({$+1<Annee={2026}>} Montant)- Ensemble A
- Alice · Lucas · Serge
- Ensemble B
- Serge · Sonia · Sophie
- Résultat A + B
- Alice · Lucas · Serge · Sonia · Sophie — réunion des deux ensembles.
Différence symétrique — A / B
/ = différence symétrique. On garde ce qui appartient à A ou à B, mais pas ce qui appartient aux deux à la fois.
Sum({$ / 1<Annee={2026}>} Montant)- Ensemble A
- Dudu · Dédé · Martial
- Ensemble B
- Martial · Karine · Tristan
- Résultat A / B
- Dudu · Dédé · Karine · Tristan — présents dans un seul des deux ensembles.
Set Analysis avec Aggr()
Aggr() crée une agrégation intermédiaire par Client. Le Set Analysis est appliqué à la somme interne avant le calcul de la moyenne.
Avg(Aggr(Sum({<Annee={2026}>} Montant), Client))On obtient la moyenne des montants 2026 agrégés par client, plutôt que la moyenne brute des lignes.
| Étape 1 | Somme 2026 par Client |
|---|---|
| Étape 2 | Moyenne des sommes clients |
| Effet | Aggr() crée le niveau intermédiaire avant Avg(). |
Ensembles naturels et non naturels
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.
Sum({$-<Client={'X'}>} Montant)Dans cet exemple adapté pour SOSBI, 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.
| Objectif | Exclure Client = X |
|---|---|
| Particularité | Les NULL peuvent subsister |
| Conseil HIC | Un ensemble de records n’est pas toujours reproductible par sélection. |
Les limites des ensembles non naturels
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.
P({1<Produit={'A'}>} Client)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().
| Ensemble | Produit = A sur {1} |
|---|---|
| Valeurs retournées | Clients possibles |
| Conseil HIC | P() et E() exigent un ensemble naturel. |
Nouvelle syntaxe : Set externe
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.
{<Annee={2026}>} Sum(Montant)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.
| Contexte externe | Annee = 2026 |
|---|---|
| Agrégation | Sum(Montant) |
| Gain | Le filtre n’est plus enfermé dans la mesure. |
Un Set pour plusieurs agrégations
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.
{<Annee={2026}>} Sum(CA) / Count(DISTINCT Commande)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.
| Set écrit | Une seule fois |
|---|---|
| Agrégations | Sum(CA) / Count(DISTINCT Commande) |
| Gain | Moins de répétition, meilleure lisibilité. |
Portée lexicale avec parenthèses
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.
({<Annee={2026}>} Sum(CA) / Count(Commande)) - Avg(Objectif)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.
| Portée filtrée | Expression entre parenthèses |
|---|---|
| Hors portée | Avg(Objectif) |
| Repère | Les parenthèses délimitent l’effet du Set externe. |
Contexte et héritage des Sets
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.
{<Annee={2026}>} Sum({<Region={'PACA'}>} Montant)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.
| Set externe | Annee = 2026 |
|---|---|
| Set interne | Region = PACA |
| Résultat | Le modificateur interne hérite du contexte externe. |
Set externe et Aggr()
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.
{<Annee={2026}>} Avg(Aggr(Sum(Montant), Client))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().
| Set externe | Annee = 2026 |
|---|---|
| Niveaux | Avg() puis Aggr()/Sum() |
| Conseil HIC | Placer le Set hors de l’agrégation permet l’héritage aux deux niveaux. |
Sources et attribution
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 SOSBI ont été réécrits et adaptés en français ; ils ne constituent pas une traduction des articles originaux.