· 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.

À gauche, la source Budget.xlsx avec une colonne Agency et trois colonnes de mois, Jan 2026, Feb 2026 et Mar 2026, pour les agences Lyon et Paris. Une flèche CrossTable mène à droite à la table Budget, qui compte six lignes avec les champs Agency, MonthText et Amount : les trois lignes de Lyon, surlignées, reprennent 120, 130 et 125.

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_attribut reçoit les en-têtes des colonnes dépivotées (MonthText).
  • champ_données reçoit les valeurs des cellules (Amount).
  • n est 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.

À gauche, une source avec les colonnes Agency, Type, Jan 2026 et Feb 2026, et deux lignes Lyon Budget et Lyon Actual. Une flèche marquée n = 2 mène à la table Amounts, qui garde Agency et Type sur chaque ligne et compte quatre lignes, une par type et par mois.

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 n champs qualifiants, 1 par défaut.
  • Les qualifiants d’abord. Les n premières colonnes du LOAD sont 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

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.