· Par Équipe HeyData

Série : Fonctions et mots-clés méconnus de Qlik Sense : une série · article 2 sur 13

Set analysis avancé dans Qlik Sense : P(), E(), opérateurs et recherches

Sum({<Year = {2026}>} Sales) : la plupart des développeurs Qlik écrivent ce genre d’expression tous les jours. Le set analysis va pourtant bien plus loin. Il sait répondre à « les ventes des clients qui ont déjà acheté tel produit », « les clients qui ne l’ont jamais acheté » ou « les clients dont le total dépasse un seuil », sans une ligne de script. Ces possibilités restent peu utilisées, et un piège revient sans cesse dans la Qlik Community.

Cet article fait partie de notre série sur les fonctions et mots-clés méconnus de Qlik Sense. Il s’appuie sur l’aide Qlik et sur la Qlik Community ; les liens sont en fin d’article.

Rappel : identifiant, modificateur, opérateurs

Une expression d’ensemble se compose d’un identifiant et d’un modificateur :

  • l’identifiant désigne un ensemble de lignes : $ pour la sélection courante (par défaut), 1 pour toutes les lignes, $1 pour la sélection précédente, un signet, ou le nom d’un état alternatif ;
  • le modificateur, entre chevrons, change la sélection de certains champs : <Year = {2026}>, ou <Region = > pour effacer la sélection de Region.

Les identifiants se combinent avec quatre opérateurs : + (union), - (exclusion), * (intersection) et / (différence symétrique). {1 - $} désigne ainsi les lignes exclues par la sélection courante.

P() et E() : les valeurs liées à un autre ensemble

P() renvoie les valeurs possibles d’un champ dans un ensemble, E() ses valeurs exclues. Placées dans un modificateur, elles sélectionnent un champ d’après ce qui se passe dans un autre.

Une table d’achats, toutes années confondues, pour les clients A à D et les produits Shoe, Hat et Bag : A a acheté Shoe et Hat, B Hat et Bag, C Shoe et Bag, D seulement Bag. Les lignes A et C, qui ont acheté Shoe, sont surlignées. À droite, P({1<Product={'Shoe'}>} Customer) donne A et C, et E({1<Product={'Shoe'}>} Customer) donne B et D.

P() retient les clients qui ont acheté Shoe, E() les autres.

// Ventes des clients qui ont déjà acheté Shoe, tous produits confondus
Sum({<Customer = P({1<Product = {'Shoe'}>} Customer)>} Amount)

// Ventes des clients qui n’ont jamais acheté Shoe
Sum({<Customer = E({1<Product = {'Shoe'}>} Customer)>} Amount)

Le 1 interne compte : il cherche les acheteurs de Shoe dans tout l’historique, quelle que soit la sélection. Si l’utilisateur sélectionne 2026, la mesure donne les ventes 2026 des clients qui ont acheté Shoe un jour, même en 2025. L’aide Qlik précise que seuls les ensembles « naturels », ceux qu’une sélection peut décrire, fonctionnent de façon fiable dans P() et E() : évitez-y {1-$}.

Combiner des listes de valeurs

Les quatre opérateurs s’appliquent aussi aux listes de valeurs d’un modificateur :

Deux listes de valeurs, Shoe et Hat d’une part, Hat et Bag d’autre part, combinées par les quatre opérateurs : l’union donne Shoe, Hat et Bag ; l’exclusion donne Shoe ; l’intersection donne Hat ; la différence symétrique donne Shoe et Bag.

Union, exclusion, intersection et différence symétrique.

Sum({<Product = {'Shoe', 'Hat'} - {'Hat'}>} Amount)                 // Shoe seulement
Sum({<Customer = P({1<Product = {'Shoe'}>}) * P({1<Product = {'Bag'}>})>} Amount)   // ont acheté Shoe ET Bag

Le - placé seul donne le complément : <Product = -{'Bag'}> sélectionne tous les produits sauf Bag.

Affecter par rapport à la sélection : +=, -=, *=, /=

Le signe = remplace la sélection du champ. Ses variantes la modifient :

  • <Year += {2026}> ajoute 2026 à la sélection courante ;
  • <Region -= {'Nord'}> retire Nord de la sélection ;
  • <Region *= {'Nord', 'Sud'}> garde l’intersection de la sélection et de la liste.

Avec 2025 sélectionné, Sum({<Year += {2026}>} Amount) porte sur 2025 et 2026, alors que Sum({<Year = {2026}>} Amount) ne porte que sur 2026.

Les recherches dans un modificateur

Entre guillemets doubles, une valeur devient une recherche :

  • jokers : {"Sh*"} ou {"?at"} ;
  • intervalles numériques ou de dates : {">=2025<=2026"}, le format devant suivre celui du champ ;
  • recherche par expression : {"=Sum(Amount) >= 100"} retient chaque valeur du champ pour laquelle la condition est vraie.
// Ventes des clients dont le total atteint 100
Sum({<Customer = {"=Sum(Amount) >= 100"}>} Amount)

La somme interne suit la sélection courante ; pour un seuil calculé sur tout l’historique, écrivez {"=Sum({1} Amount) >= 100"}. Les guillemets simples, eux, désignent une valeur exacte, sensible à la casse ; les doubles font une recherche insensible à la casse.

Le piège : un ensemble par graphique, pas par ligne

L’expression d’ensemble est évaluée une seule fois pour tout le graphique, avant le calcul des lignes. Elle ne peut donc pas dépendre de la valeur de la dimension sur chaque ligne. Dans une table par année, cette mesure ne donne pas « les ventes de l’année précédente » :

Sum({<Year = {$(=Max(Year) - 1)}>} Amount)

Max(Year) est calculé une fois, sur la sélection : chaque ligne reçoit le filtre de la même année, et seule la ligne de cette année affiche une valeur. Pour une comparaison ligne par ligne, utilisez les fonctions inter-lignes comme Above(), ou préparez un champ dans le script. La Qlik Community le rappelle dans de nombreux fils, dont celui cité en source.

À retenir

  • P() et E() relient deux champs. « Les clients qui ont acheté X », « ceux qui ne l’ont jamais acheté ».
  • Le 1 interne ignore la sélection. Pour chercher dans tout l’historique, quelle que soit la sélection.
  • Des opérateurs sur les valeurs. +, -, * et / combinent aussi des listes de valeurs.
  • += et -= modifient la sélection. Le signe = la remplace.
  • Des recherches par expression. {"=Sum(Amount) >= 100"} filtre les valeurs d’un champ selon un calcul.
  • Un ensemble par graphique. Le set analysis ne dépend jamais de la ligne : pour cela, Above() ou le script.

Essayer dans Qlik Sense

Ce script reprend les exemples de l’article avec les données des schémas, chargées en INLINE : il ne dépend d’aucun fichier ni d’aucune base. Collez-le dans l’éditeur de chargement de données d’une application vide et rechargez. Les expressions à essayer sont en commentaire.

// Set analysis avancé dans Qlik Sense : script d'essai (HeyData)
// Collez-le dans l'éditeur de chargement de données d'une application vide, rechargez,
// puis essayez les expressions ci-dessous dans des indicateurs (KPI) ou une table.
Sales:
LOAD * INLINE [
Customer, Product, Year, Amount
A, Shoe, 2025, 100
A, Hat, 2026, 50
B, Hat, 2025, 70
B, Bag, 2026, 30
C, Shoe, 2026, 200
C, Bag, 2025, 40
D, Bag, 2026, 60
];

// Sans sélection :
//   Sum(Amount)                                                         → 550
//   Sum({<Customer = P({1<Product = {'Shoe'}>} Customer)>} Amount)       → 390 (A et C, premier schéma)
//   Sum({<Customer = E({1<Product = {'Shoe'}>} Customer)>} Amount)       → 160 (B et D)
//   Sum({<Product = {'Shoe', 'Hat'} - {'Hat'}>} Amount)                 → 300 (deuxième schéma)
//   Sum({<Customer = P({1<Product = {'Shoe'}>}) * P({1<Product = {'Bag'}>})>} Amount)   → 240 (C)
//   Sum({<Customer = {"=Sum(Amount) >= 100"}>} Amount)                  → 490 (A, B et C)
//
// Sélectionnez Year = 2026 :
//   Sum({<Customer = P({1<Product = {'Shoe'}>} Customer)>} Amount)       → 250 (ventes 2026 de A et C)
//
// Sélectionnez Year = 2025 :
//   Sum({<Year += {2026}>} Amount)                                      → 550 (2025 et 2026)
//   Sum({<Year = {2026}>} Amount)                                       → 340 (2026 seulement)
//
// Le piège : table par Year, sans sélection
//   Sum({<Year = {$(=Max(Year) - 1)}>} Amount)   → 210 sur la ligne 2025 ; 0 sur 2026 (ligne masquée si les zéros le sont)

Sources

Le texte et les exemples sont de HeyData. Cet article fait partie de notre série sur les fonctions et mots-clés méconnus de Qlik Sense : découvrir la série.