Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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;
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;
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