TUTORIEL · QLIK SENSE
Les fonctions utiles de Qlik
Above, Below, RangeSum, Pick, Match, WildMatch, Rank, Dual et bien d’autres : les fonctions à connaître pour construire des expressions efficaces.
La boîte à outils des expressions Qlik
Qlik possède énormément de fonctions. Pour choisir une expression, commence par préciser ce que tu souhaites obtenir : transformer une valeur, résumer des enregistrements, consulter une autre ligne du tableau ou calculer sur plusieurs résultats successifs. Ces quatre besoins correspondent notamment aux fonctions scalaires, aux agrégations, aux fonctions inter-enregistrements et aux fonctions Range. Cette grille de lecture s’inspire des familles décrites par Henric Cronström (HIC), mais le parcours proposé ici part de situations concrètes rencontrées dans les applications Qlik.
Une expression courte et lisible est presque toujours préférable à une construction compliquée équivalente.
Exemple
| Objectif | Choisir la bonne fonction au bon moment | avec des exemples directement réutilisables |
|---|
| Inter-record | Above · Below · RowNo |
|---|---|
| Logique | If · Pick · Match · WildMatch |
| Plages | RangeSum · RangeAvg |
| Autres | Alt · Coalesce · Class · Dual · dates |
Above() — regarder la ligne précédente
Above() évalue une expression sur une ligne située au-dessus de la ligne courante dans le segment de colonne. Sans offset, elle regarde la ligne précédente.
Ton tableau affiche : Janvier = 100 €, Février = 120 €, Mars = 90 €.
Sur la ligne Février, Above(Sum(CA)) vaut 100 €, car Qlik regarde la ligne juste au-dessus. Donc Sum(CA)-Above(Sum(CA)) donne +20 €.
Sur Mars, Above vaut 120 €, donc la variation vaut -30 €.
Above() dépend de l’ordre des lignes. Ne confonds pas ordre d’affichage et calendrier : si une période disparaît après une sélection, Above() se reporte sur la ligne visible qui la précède, même si les deux dates ne se suivent pas. Le tri et les valeurs dimensionnelles affichées font donc partie du calcul.
Exemple
| Variation | Sum(CA) - Above(Sum(CA)) | écart entre la ligne courante et la précédente |
|---|
| Précédent | Above(expr) |
|---|---|
| 2 lignes avant | Above(expr,2) |
| Courante | Above(expr,0) |
Below() — regarder la ligne suivante
Below() est le pendant d’Above() : il évalue l’expression sur une ligne située sous la ligne courante.
Comme Above(), Below() travaille sur les segments de colonne et dépend du tri.
Exemple
| Suivante | Below(Sum(CA)) - Sum(CA) | écart entre la prochaine ligne et la ligne courante |
|---|
| Suivante | Below(expr) |
|---|---|
| Offset | Below(expr,n) |
| Sens inverse | Offset négatif possible |
RangeSum() + Above() — le cumul
RangeSum() additionne une plage de valeurs. Associée à Above(), elle permet de construire très simplement un cumul glissant ou progressif.
Sum(CA) calcule le CA de la ligne. Above(...,0,RowNo()) fabrique une liste : ligne actuelle + toutes les lignes précédentes. Enfin RangeSum(...) additionne cette liste.
Jan = 100, Fév = 120, Mars = 90 → cumul Mars = 100 + 120 + 90 = 310 €.
RangeSum() traite les valeurs non numériques comme 0, ce qui est souvent plus pratique qu’une addition classique.
Exemple
| Cumul | RangeSum(Above(Sum(CA),0,RowNo())) | cumul progressif dans l’ordre du graphique |
|---|
| Plage | Above(...,0,count) |
|---|---|
| Somme | RangeSum(...) |
| Count dynamique | RowNo() |
RangeAvg() — moyenne mobile
RangeAvg() calcule la moyenne d’une plage. Avec Above(), on obtient une moyenne mobile sur les dernières périodes.
La taille de fenêtre peut être remplacée par une variable pour rendre le calcul paramétrable.
Exemple
| 3 périodes | RangeAvg(Above(Sum(CA),0,3)) | moyenne de la période courante et des deux précédentes |
|---|
| Fenêtre | 3 lignes |
|---|---|
| Source | Above() |
| Calcul | RangeAvg() |
RowNo() — connaître la position
RowNo() renvoie le numéro de la ligne courante dans le segment de colonne. Avec TOTAL, la numérotation porte sur la colonne entière.
Les fonctions inter-record peuvent désactiver certains tris par mesure ; vérifiez toujours l’ordre final.
Exemple
| Première ligne | If(RowNo()=1, 0, Sum(CA)-Above(Sum(CA))) | évite le NULL de la première comparaison |
|---|
| Segment | RowNo() |
|---|---|
| Toute la colonne | RowNo(TOTAL) |
| Usage | Cumul · conditions |
Before() et After() — colonnes d’un tableau croisé
Before() et After() jouent horizontalement un rôle comparable à Above() et Below(), mais ils sont destinés aux tableaux croisés dynamiques.
N’utilisez pas Before()/After() dans un tableau simple : utilisez Above()/Below() selon la structure.
Exemple
| Évolution | (Sum(CA)-Before(Sum(CA))) / Before(Sum(CA)) | variation par rapport à la colonne précédente d’un pivot |
|---|
| Gauche | Before() |
|---|---|
| Droite | After() |
| Objet | Tableau croisé dynamique |
If() — la condition de base
If() teste une condition et renvoie la valeur prévue pour le cas vrai. Si la condition est fausse, il renvoie la valeur alternative lorsqu’elle est fournie ; sinon, le résultat est NULL.
Quand vous commencez à imbriquer quatre ou cinq If(), demandez-vous s’il existe une solution plus claire.
Exemple
| Statut | If(Sum(CA)>100000,'Objectif atteint','À suivre') | deux résultats selon une condition |
|---|
| Syntaxe | If(condition, vrai [, faux]) |
|---|---|
| Usage | Condition simple |
| Attention | Éviter les cascades géantes |
Match(), MixMatch() et WildMatch()
Match() cherche une correspondance exacte et renvoie sa position dans la liste. MixMatch() fait une comparaison insensible à la casse. WildMatch() ajoute les jokers * et ? et ignore aussi la casse.
WildMatch() est extrêmement pratique pour éviter une longue série de comparaisons OR.
Exemple
| Recherche | WildMatch(Produit,'PC*','Tablet*','Phone*') | 1, 2, 3 selon le motif trouvé ; 0 sinon |
|---|
| Match | Exact + sensible à la casse |
|---|---|
| MixMatch | Exact + casse ignorée |
| WildMatch | Jokers * et ? |
Pick() — choisir dans une liste
Pick() renvoie le nième élément d’une liste. Son intérêt devient évident lorsqu’on lui fournit le résultat numérique d’un Match().
Match(Region,'Nord','Sud','Est') cherche la région. Si Region = 'Sud', il répond 2.
Pick(2,'N','S','E') prend alors le 2e élément et répond 'S'.
Donc : Match trouve le numéro, Pick utilise ce numéro.
Pick() ne cherche rien lui-même : il choisit selon un numéro.
Exemple
| Pick + Match | Pick(Match(Region,'Nord','Sud','Est'),'N','S','E') | transforme la position trouvée en valeur choisie |
|---|
| Pick(1,...) | Premier élément |
|---|---|
| Pick(2,...) | Deuxième |
| Partenaire idéal | Match() |
Pick(Match()) — le duo à connaître
En combinant Match() et Pick(), on obtient une structure de correspondance très lisible : Match() détermine le numéro et Pick() renvoie la valeur associée.
Pour un mapping massif et stable, préférez néanmoins une table de mapping dans le script.
Exemple
| Libellé | Pick(Match(Code,'A','B','C'),'Actif','Bloqué','Clôturé') | équivalent compact d’une cascade de If() |
|---|
| Étape 1 | Match() → index |
|---|---|
| Étape 2 | Pick() → valeur |
| Résultat | Mapping dans l’expression |
Alt() et Coalesce() — valeurs de secours
Alt() renvoie le premier paramètre ayant une représentation numérique valide, puis la valeur de secours finale. Coalesce() renvoie le premier paramètre qui n’est pas NULL.
Coalesce() évite souvent des If(IsNull(...)) imbriqués.
Exemple
| NULL | Coalesce(TelephoneMobile, TelephoneFixe, 'Non renseigné') | première valeur non NULL |
|---|
| Alt | Premier nombre valide |
|---|---|
| Coalesce | Premier non-NULL |
| Usage | Valeurs de repli |
Class() — créer des tranches
Class() affecte une valeur numérique à un intervalle. C’est parfait pour créer rapidement des tranches d’âge, de montant, de délai ou de volume.
Pour des tranches métier irrégulières, une logique spécifique ou une table dédiée sera plus appropriée.
Exemple
| Tranches | Class(Montant,500) | pour Montant = 1275, la classe affichée est 1000<=x<1500 |
|---|
| Valeur | Montant |
|---|---|
| Largeur | 500 |
| 3e argument | Libellé de x (facultatif) |
Dual() — un texte et un nombre
Dual() associe une représentation texte à une valeur numérique. Qlik affiche le texte mais peut trier ou calculer avec la valeur numérique.
Beaucoup de valeurs Qlik, notamment certaines dates et résultats de Class(), exploitent déjà le principe des valeurs duales.
Exemple
| Priorité | Dual('Élevée',3) | affiche « Élevée » mais conserve la valeur numérique 3 |
|---|
| Affichage | Texte |
|---|---|
| Tri/calcul | Nombre |
| Usage | Ordre métier |
Only() — une seule valeur ou NULL
Only() renvoie une valeur lorsqu’il n’existe qu’une seule valeur possible dans le contexte d’agrégation. S’il en existe plusieurs, le résultat est NULL.
Only() est aussi un bon révélateur d’un contexte plus large que prévu.
Exemple
| Sélection | Only(Annee) | affiche 2026 si une seule année est possible, sinon NULL |
|---|
| 1 valeur | Valeur retournée |
|---|---|
| Plusieurs | NULL |
| Usage | Contexte / sélection |
Min(), Max() et FirstSortedValue()
Min() et Max() trouvent les extrema numériques. FirstSortedValue() permet de récupérer une valeur associée à un ordre de tri, par exemple le produit correspondant au plus gros chiffre d’affaires.
En cas d’ex æquo, FirstSortedValue() peut renvoyer NULL selon le contexte : testez les égalités.
Exemple
| Top produit | FirstSortedValue(Produit,-Aggr(Sum(CA),Produit)) | renvoie le produit classé sur le CA décroissant |
|---|
| Min/Max | Valeur extrême |
|---|---|
| FirstSortedValue | Valeur associée au tri |
| Signe - | Tri décroissant |
Rank() — classer les résultats
Rank() renvoie le rang d’une expression parmi les lignes d’un segment de colonne. Il permet de créer des classements dynamiques qui réagissent aux sélections.
Comme les autres fonctions inter-record, le contexte et la segmentation du graphique sont essentiels.
Exemple
| Classement | Rank(Sum(CA)) | rang du CA dans le contexte du graphique |
|---|
| Mesure | Sum(CA) |
|---|---|
| Résultat | Rang |
| Contexte | Dépend des dimensions/sélections |
Concat() — regrouper du texte
Concat() agrège plusieurs valeurs textuelles dans une seule chaîne avec un séparateur. Avec DISTINCT, on peut éliminer les doublons.
Une liste très longue devient vite illisible : pensez à limiter son usage à des ensembles raisonnables.
Exemple
| Liste | Concat(DISTINCT Region, ', ') | PACA, Occitanie, Bretagne… |
|---|
| Agrégation | Texte |
|---|---|
| Séparateur | ', ' |
| Option | DISTINCT |
Num(), Date() et Timestamp() — maîtriser l’affichage
Num(), Date() et Timestamp() servent principalement à formater la représentation d’une valeur numérique ou temporelle sans changer la logique métier sous-jacente.
Ne confondez pas formatage et interprétation : Date#() et Num#() servent à interpréter du texte, Date() et Num() à formater une valeur.
Exemple
| Date | Date(DateCommande,'DD/MM/YYYY') | formate la représentation de la date |
|---|
| Num | Nombre |
|---|---|
| Date | Date |
| Timestamp | Date + heure |
MonthStart(), AddMonths() et InMonth()
Les fonctions de date Qlik permettent d’éviter beaucoup de calculs manuels. MonthStart() ramène au début du mois, AddMonths() décale une date et InMonth() teste l’appartenance à un mois relatif.
Pour les applications complexes, un calendrier maître bien construit reste préférable à une multiplication de calculs de dates.
Exemple
| Mois précédent | MonthStart(AddMonths(Today(),-1)) | premier jour du mois précédent |
|---|
| Début de mois | MonthStart() |
|---|---|
| Décalage | AddMonths() |
| Test relatif | InMonth() |
GetSelectedCount() et GetFieldSelections()
Ces fonctions permettent d’interroger les sélections de l’utilisateur. GetSelectedCount() compte les valeurs sélectionnées d’un champ ; GetFieldSelections() en fournit une représentation textuelle.
Évitez de faire dépendre toute la logique métier de l’interface des sélections ; utilisez-les surtout pour améliorer l’expérience.
Exemple
| Titre | If(GetSelectedCount(Annee)=1,'Année : '&GetFieldSelections(Annee),'Plusieurs années') | titre dynamique selon la sélection |
|---|
| Compter | GetSelectedCount() |
|---|---|
| Afficher | GetFieldSelections() |
| Usage | UX dynamique |
Sum(), Count(), Avg()… — les agrégations
Quand un tableau regroupe plusieurs interventions par service, une mesure comme Sum(Montant) doit produire un seul résultat par service. C’est le rôle des agrégations telles que Sum(), Count(), Avg(), Min(), Max(), Only() et Concat(). Cette distinction entre niveaux de calcul est également développée par HIC.
Un service facture 40 €, 65 € et 75 €.
Sum(Montant) → 180 €Avg(Montant) → 60 €Min(Montant) → 40 €Max(Montant) → 75 €.
Dans un graphique, la dimension décide sur quelles lignes cette réduction est faite.
HIC rappelle qu’une expression de mesure doit généralement aboutir à une seule valeur pour chaque cellule du graphique.
Exemple
| Principe | Plusieurs lignes → une valeur | c’est le rôle d’une agrégation |
|---|
| Sum | Somme |
|---|---|
| Count | Compte |
| Avg | Moyenne |
| Only | Une valeur unique sinon NULL |
Count() ou Count(DISTINCT) ? — le piège classique
Avant de compter, décide ce que représente ton indicateur : des lignes d’activité ou des objets métier distincts. Count(Champ) compte les occurrences non NULL du champ, tandis que Count(DISTINCT Champ) ne retient qu’une occurrence par valeur. HIC rappelle notamment la vigilance nécessaire sur les champs clés.
Le ticket T42 possède 3 interventions ; le ticket T43 en possède 2. Le journal d’interventions contient donc 5 lignes.
Count(TicketID) → 5 dans cette table d’interventions.
Count(DISTINCT TicketID) → 2 tickets différents.
Si TicketID est une clé partagée par plusieurs tables, Count(TicketID) peut compter des occurrences à un grain différent de celui attendu. Pour compter des tickets uniques, utilise DISTINCT ; pour compter des interventions, compte un identifiant propre à la table des interventions.
Exemple
| Nombre de commandes | Count(DISTINCT TicketID) | compte les tickets, même si chacun comporte plusieurs interventions |
|---|
| Count | Occurrences non NULL |
|---|---|
| Count DISTINCT | Valeurs uniques |
| Réflexe | Identifier le grain attendu |
Avg() — quelle moyenne veux-tu vraiment ?
La moyenne doit toujours être rattachée à une unité de calcul. Avg(Montant) mesure la moyenne des montants présents sur les lignes ; une moyenne mensuelle du chiffre d’affaires demande d’abord de regrouper ces lignes par mois. HIC illustre également cette différence de granularité.
En janvier 2026, 4 interventions totalisent 150 €. En février 2026, 2 interventions totalisent 450 €.
La moyenne mensuelle est (150 + 450) / 2 = 300 €. En revanche, Avg(Montant) renverrait 100 € si les 600 € sont répartis sur les 6 lignes d’interventions.
Il faut donc calculer le total par mois, puis la moyenne des totaux.
Utilise un identifiant de période unique (par exemple AnnéeMois) plutôt que le seul nom du mois. Les mois sans données ne sont pas inclus automatiquement : décide si tu veux les compter comme des mois à zéro.
Exemple
| Moyenne par mois | Avg(Aggr(Sum(Montant), MoisID)) | MoisID doit distinguer janvier 2026 de janvier 2027 |
|---|
| Question 1 | Quel est le grain des données ? |
|---|---|
| Question 2 | Moyenne par quoi ? |
| Deux niveaux | Aggr() si nécessaire |
Calculer dans le script ou dans le graphique ?
Une transformation indépendante des sélections peut généralement être préparée dans le script. En revanche, une mesure qui dépend du contexte choisi par l’utilisateur doit rester dynamique. C’est un principe de conception également exposé par HIC.
WeekStart(DateIntervention) : le début de semaine d’une intervention ne change pas selon les filtres → calcul possible dans le script.
Rank(Sum(Montant)) : le classement des services varie avec la période sélectionnée → calcul à conserver dans un tableau ou diagramme.
La documentation Qlik recommande également de pré-calculer dans le script les mesures possibles au niveau de granularité le plus bas.
Exemple
| Règle | Statique → script · Dynamique → graphique | moins de calculs inutiles au clic |
|---|
| Date → semaine | Statique |
|---|---|
| Classement | Dynamique |
| Objectif | Performance + clarté |
Above() et les périodes absentes — attention !
Une moyenne mobile calculée sur trois lignes n’est pas nécessairement une moyenne sur trois périodes calendaires consécutives. Si le tableau masque une période, Above() ne la reconstitue pas. Ce comportement est notamment décrit dans les travaux de HIC.
Le tableau affiche les semaines 31, 32 et 34, mais aucune ligne pour la semaine 33.
En semaine 34, Above(Sum(Montant)) reprend la valeur de la semaine 32, et non celle de la semaine 33.
Une moyenne sur trois lignes mélange alors les semaines 31, 32 et 34 : ce ne sont pas trois semaines consécutives.
Pour une véritable fenêtre calendaire, construis une dimension temporelle complète, contrôle les options d’affichage des périodes sans activité et vérifie le comportement sous sélection. Ne remplace pas systématiquement les périodes absentes par zéro : cela dépend de la mesure métier.
Exemple
| À vérifier | Calendrier complet + valeurs zéro si nécessaire | les périodes absentes doivent exister dans le graphique si le calcul en dépend |
|---|
| Above | Ligne précédente |
|---|---|
| Pas | Période précédente |
| Solution | Afficher les périodes nécessaires |
Quelle fonction choisir ?
Le bon réflexe est de partir du besoin : ligne précédente → Above(); cumul → RangeSum(Above()); choix par index → Pick(); correspondance → Match/WildMatch(); valeur de secours → Coalesce/Alt; tranche → Class(); ordre métier → Dual().
Ce tutoriel est une boîte à outils : revenez-y selon le problème rencontré plutôt que d’essayer de mémoriser toutes les fonctions.
Exemple
| Réflexe SOSBI | Besoin → fonction → contexte → tri → test | comprendre avant de complexifier |
|---|
| Comparer lignes | Above / Below |
|---|---|
| Choisir | Pick / Match |
| Cumuler | Range* |
| Sécuriser | Alt / Coalesce |
Références Qlik
Ce tutoriel croise la documentation officielle Qlik avec plusieurs articles pédagogiques de Henric Cronström (HIC), notamment « Aggregations and Function Classes », « The Above Function », « Accumulations », « Count or Count distinct? » et « Average – Which average? ». Les explications et mises en situation de SOSBI ont été rédigées pour ce tutoriel. Les noms de fonctions et expressions usuelles sont conservés lorsque la syntaxe Qlik l’exige. Les articles cités restent des références de fond, et non des textes reproduits.