· 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),1pour toutes les lignes,$1pour 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 deRegion.
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.
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 :
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
- Aide Qlik Cloud : Expressions d’ensemble, identifiants et opérateurs.
- Aide Qlik Cloud : Fonctions P() et E(), opérateurs dans les modificateurs, affectations implicites et recherches.
- Qlik Community : A set analysis is calculated once per chart/table….
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.