Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

LOAD en cascade avec jointure

Bonjour

Je souhaite savoir si il est possible de bénéficier du mécanisme de chargement en cascade pour ajouter un champ calculé sur un ensemble de données résultant d'une jointure.

Objectif : Joindre les tables INDICATEUR, STAT et PERIODE dans une table cible FINAL tout en y ajoutant un champ calculé.

Problème : le champ calculé « ValeurCalcul » utilise un champ provenant du second LEFT JOIN. QlikView indique qu’il ne connaît pas le champ V2, ça ne fonctionne pas mieux si j’utilise le nom du champ avant son renommage par l’alias (à savoir LenPeriode).

Question : Existe-t-il un moyen pour ajouter ce champ calculé à la table FINAL sans passer par une table temporaire ?

Voici le script avec en jaune fluo la ligne qui plante. Ce script est juste un cas d’école facile à reproduire. Dans la vraie vie, ma table FINAL contient plusieurs millions de lignes et la dupliquer dans une table temporaire juste pour y ajouter un champ calculé, je ne trouve pas ça très performant …

INDICATEUR:
LOAD * INLINE [
    CodeIndicateur, NomIndicateur
    1, Connexions
    2, Abonnés distincts
    3, Connexions / Abonné
]
;

STAT:
LOAD * INLINE [
    CodePeriode, CodeIndicateur, Valeur
    201301, 1, 10
    201302, 1, 20
    201303, 1, 30
    201304, 1, 40
    201301, 2, 5
    201302, 2, 10
    201303, 2, 15
    201304, 2, 20
]
;

PERIODE:
LOAD * INLINE [
    CodePeriode, NomPeriode, LenPeriode
    201301, Janvier 2013, 12
    201302, Février 2013, 12
    201303, Mars 2013, 9
    201304, Avril 2013, 10
]
;

FINAL:
NOCONCATENATE LOAD
  *,
  (
V2 + 1)*V1 as ValeurCalcul;
 
LOAD
 
CodePeriode,
 
CodeIndicateur,
 
Valeur as V1
RESIDENT STAT;

LEFT JOIN (FINAL)
LOAD
 
CodeIndicateur,
 
NomIndicateur
RESIDENT INDICATEUR;


LEFT JOIN (FINAL)
LOAD
 
CodePeriode,
 
NomPeriode,
 
LenPeriode as V2
RESIDENT PERIODE;

DROP TABLE STAT;
DROP TABLE INDICATEUR;
DROP TABLE PERIODE;

2 Replies
maxgro
MVP
MVP

I don't have real data so I can't check for performance

This is just one possibility; if you give me some indication on the numbers of records of the tables I can try to generate data and to compare the two solutions; for now, without knowing anything about this I would choose the one with the apply map

MapINDICATEUR:

Mapping

LOAD * INLINE [

    CodeIndicateur, NomIndicateur

    1, Connexions

    2, Abonnés distincts

    3, Connexions / Abonné

];

STAT:

LOAD * INLINE [

    CodePeriode, CodeIndicateur, Valeur

    201301, 1, 10

    201302, 1, 20

    201303, 1, 30

    201304, 1, 40

    201301, 2, 5

    201302, 2, 10

    201303, 2, 15

    201304, 2, 20

];

PERIODE:

LOAD * INLINE [

    CodePeriode, NomPeriode, LenPeriode

    201301, Janvier 2013, 12

    201302, Février 2013, 12

    201303, Mars 2013, 9

    201304, Avril 2013, 10

];

MapPERIODE1: Mapping load CodePeriode, NomPeriode Resident PERIODE;

MapPERIODE2: Mapping load CodePeriode, LenPeriode Resident PERIODE;

DROP Table PERIODE;

FINAL:

LOAD

  CodePeriode,

  CodeIndicateur,

  Valeur as V1,

  ApplyMap('MapINDICATEUR', CodeIndicateur, 'Missing') as NomIndicateur,

  ApplyMap('MapPERIODE1', CodePeriode, 'Missing') as NomPeriode,

  ApplyMap('MapPERIODE2', CodePeriode, 'Missing') as LenPeriode, 

  (ApplyMap('MapPERIODE2', CodePeriode, 'Missing') +1)* Valeur as ValeurCalcul

RESIDENT STAT;

DROP TABLE STAT;

Not applicable
Author

Thank you for this answer but as I explained, these data are just a sample. My real case is very complex.

Mapping is a good idea, I keep it in mind but it doesn't solve my problem :

1) In fact, I join more than 4 tables and my calculated field V2 used numeric fields coming from these 4 tables.

2) Table STAT contains more than 15 million records and performance could be a problem.

Regards