· Par Équipe HeyData
Série : Fonctions et mots-clés méconnus de Qlik Sense : une série · article 6 sur 13
CrossTable dans Qlik Sense : dépivoter un tableau croisé dès le chargement
Le budget arrive d’Excel avec une colonne par mois : Jan 2026, Feb 2026, Mar 2026… Chargé tel quel, il donne un champ par mois, impossible à filtrer par période, à relier au calendrier ou à sommer sur l’année. Il faut dépivoter : transformer les colonnes en lignes. Le préfixe CrossTable le fait pendant le chargement.
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 ; les liens sont en fin d’article.
Le principe
CrossTable se place devant un LOAD. Il garde les premières colonnes telles quelles : ce sont les champs qualifiants. Chaque autre colonne devient une ligne. Son en-tête part dans un champ d’attribut, et sa valeur dans un champ de données.
Trois colonnes de mois et deux agences donnent six lignes.
Budget:
CrossTable (MonthText, Amount)
LOAD * INLINE [
Agency, Jan 2026, Feb 2026, Mar 2026
Lyon, 120, 130, 125
Paris, 200, 210, 190
];
La syntaxe complète :
CrossTable (champ_attribut, champ_données [, n]) LOAD …
champ_attributreçoit les en-têtes des colonnes dépivotées (MonthText).champ_donnéesreçoit les valeurs des cellules (Amount).nest le nombre de champs qualifiants, 1 par défaut.
L’intérêt de LOAD * : le mois suivant, une colonne Apr 2026 ajoutée au fichier est prise en compte sans toucher au script.
Plusieurs champs qualifiants
Quand la source porte plusieurs colonnes descriptives, comme l’agence et le type (budget ou réel), indiquez leur nombre. Ces n colonnes doivent être les premières du LOAD.
Avec n = 2, l’agence et le type sont recopiés sur chaque ligne.
Amounts:
CrossTable (MonthText, Amount, 2)
LOAD * INLINE [
Agency, Type, Jan 2026, Feb 2026
Lyon, Budget, 120, 130
Lyon, Actual, 118, 141
];
Si la colonne descriptive n’est pas en tête dans le fichier, remplacez LOAD * par une liste de champs qui la place en premier. Vous perdez alors l’ajout automatique des nouvelles colonnes.
Convertir l’attribut
MonthText contient le texte des en-têtes : 'Jan 2026' n’est ni une date ni un nombre. La conversion se fait dans une seconde passe : CrossTable charge d’abord une table temporaire, TmpBudget, que l’on relit ensuite :
Budget:
LOAD Agency,
MakeDate(Right(MonthText, 4),
Match(Left(MonthText, 3), 'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec')) as Month,
Amount
RESIDENT TmpBudget;
DROP TABLE TmpBudget;
Un piège courant : Date#(MonthText, 'MMM YYYY') dépend de la variable MonthNames de l’application. Dans une application en français, elle vaut en général janv.;févr.;mars;…, et 'Jan 2026' n’est pas reconnu. Match() et MakeDate() ne dépendent d’aucun paramètre régional.
Cette seconde passe sert aussi à nettoyer : écarter les cellules vides (WHERE Len(Trim(Amount)) > 0), ou des colonnes de total que le fichier ajoute en fin de ligne.
Sans script : le gestionnaire de données
Le gestionnaire de données propose la même opération sans écrire de code : l’option Dépivoter de l’éditeur de table transforme les colonnes sélectionnées en lignes. Le script reste préférable quand il faut convertir l’attribut ou filtrer en même temps.
CrossTable fait l’inverse du préfixe Generic : l’un met des colonnes en lignes, l’autre des lignes en colonnes.
À retenir
- Des colonnes vers des lignes. CrossTable dépivote un tableau croisé pendant le chargement.
- Trois paramètres. Le champ d’attribut, le champ de données, et
nchamps qualifiants, 1 par défaut. - Les qualifiants d’abord. Les
npremières colonnes duLOADsont recopiées, toutes les autres sont dépivotées. - L’attribut est du texte. Convertissez-le dans une seconde passe, sans dépendre de
MonthNames. - LOAD * suit le fichier. Une nouvelle colonne de mois est prise en compte sans modifier 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, choisissez l’exemple avec la variable vExemple, puis rechargez.
// CrossTable dans Qlik Sense : script d'essai (HeyData)
// Collez-le dans l'éditeur de chargement de données d'une application vide, choisissez
// l'exemple, rechargez, puis affichez la table dans la visionneuse du modèle de données.
SET vExemple = 1; // 1 à 3
IF $(vExemple) = 1 THEN
// Exemple 1 : un mois par colonne, puis conversion du mois (premier schéma)
TmpBudget:
CrossTable (MonthText, Amount)
LOAD * INLINE [
Agency, Jan 2026, Feb 2026, Mar 2026
Lyon, 120, 130, 125
Paris, 200, 210, 190
];
Budget:
LOAD Agency,
Date(MakeDate(Right(MonthText, 4),
Match(Left(MonthText, 3), 'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec')), 'YYYY-MM') as Month,
Amount
RESIDENT TmpBudget;
DROP TABLE TmpBudget;
// 6 lignes ; Month est une vraie date (2026-01, 2026-02, 2026-03).
END IF
IF $(vExemple) = 2 THEN
// Exemple 2 : deux champs qualifiants (deuxième schéma)
Amounts:
CrossTable (MonthText, Amount, 2)
LOAD * INLINE [
Agency, Type, Jan 2026, Feb 2026
Lyon, Budget, 120, 130
Lyon, Actual, 118, 141
];
// 4 lignes : Agency et Type sont recopiés sur chaque ligne.
END IF
IF $(vExemple) = 3 THEN
// Exemple 3 : le qualifiant n'est pas en tête, et une cellule est vide
TmpBudget:
CrossTable (MonthText, Amount)
LOAD Agency, [Jan 2026], [Feb 2026] INLINE [
Jan 2026, Agency, Feb 2026
120, Lyon, 130
200, Paris,
];
Budget:
NoConcatenate
LOAD * RESIDENT TmpBudget
WHERE Len(Trim(Amount)) > 0;
DROP TABLE TmpBudget;
// La liste de champs place Agency en premier ; la cellule vide de Paris est écartée.
END IF
Sources
- Aide Qlik Cloud : Crosstable, syntaxe et exemples.
- Aide Qlik Cloud : Dépivotage de données de tableau croisé dans le gestionnaire de données.
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.