Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Je rencontre un problème sur lequel j'ai trouvé des réponse mais je n'arrive pas à les mettre en oeuvre :
Si je joint deux tables dans mon script (des employés dans des services, certains employé n'ont pas de service):
table1: SELECT * FROM employes;
table2: SELECT * FROM services;
table1et2:
SELECT table1.nom, table2.nom
FROM table1 left join table2
Comment faire pour que le champs service soit complété par une valeur (sans_service) pour les employes non présents dans la table2 ?
Il me semble que c'est le même sujet qu'ici mais je ne comprend pas la réponse lorsque que les clé porte le même nom.
http://community.qlik.com/thread/9351
quelqu’un pourrait m'aider à l'adapter plus simplement à mon cas ?
Salut,
Tu pourrais essayer le suivant:
Table1:
LOAD * INLINE [
ID, Machines
1, Machine1
2 ,Machine2
3, Machine3
4, Machine4
5, Machine5
8, Machine8
];
Table2:
LOAD * INLINE [
ID_av, ID, Version
1, 5, 7000
2, 4, 7010
3, 8, 7010
4, 3, 7005
];
LEFT JOIN (Table1)
LOAD
ID,
ID_av,
Version
RESIDENT Table2;
Drop Table Table2;
temp_table:
NoConcatenate
LOAD
ID,
Machines,
if(isnull(ID_av),'Null',ID_av) as ID_av,
if(isnull(Version),'Null',Version) as Version
RESIDENT Table1;
Drop Table Table1;
RENAME Table temp_table to Table1;
Ca fonctionner sur mon ordinateur. Si tu veux je peut te filer le qvw.
Matt
Bonjour Bruno,
Si tu effectues ta jointure coté SQL :
1- Déclarer une variable pour corriger tes valeurs Null :
SET F_FieldQuality = IF(IsNull($1) = -1 OR Trim($1) = '', 'sans_service', Trim($1))
2- Mettre en oeuvre un load de la manière suivante :
Table1et2 :
LOAD FieldA_1,
$(F_FieldQuality(FieldB_1)) as Field2_1
;
SQL
SELECT A.*, B.* FROM table1 A left join table2 B
;
Si tu effectues ta jointure coté QlikView :
1- Déclarer une Mapping Table
MyMappingTable2 :
MAPPING LOAD
CHAMP1 as Clé,
CHAMP2 as Valeur
FROM (ou resident)
TABLE2
;
2- Mettre en oeuvre un load avec un applymap de la manière suivante :
Table1et2
LOAD
FieldA_1
ApplyMap(ChampDeCléDansLaTable1, 'MyMappingTable2')
FROM
TABLE1
;
Merci de ta rapidité.
Je souhaite effectuer la jointure du coté Qlikview et je n'y arrive pas (trop débutant).
J'essaie de comprendre sur un test simple :
Voici ma table1
ID | Machines |
1 | Machine1 |
2 | Machine2 |
3 | Machine3 |
4 | Machine4 |
5 | Machine5 |
8 | Machine8 |
Voici ma table2
ID_av | ID | Version |
1 | 5 | 7000 |
2 | 4 | 7010 |
3 | 8 | 7010 |
4 | 3 | 7005 |
SI je charge mes tables par un script classique, j'obtiens (et c'est juste):
ID | ID_av | Machines | Version |
1 | - | Machine1 | - |
2 | - | Machine2 | - |
3 | 4 | Machine3 | 7005 |
4 | 2 | Machine4 | 7010 |
5 | 1 | Machine5 | 7000 |
8 | 3 | - | 7010 |
Mon objectif est de remplacer les '-' de la colonne version par une valeur fixe (sans_version) et les - de la colonne Machines par une autre valeur fixe (sans_nom) de façon à pourvoir les sélectionner par la suite.
Si j'adapte ton script, je n'ai donc pas compris le fonctionnement du mapping :
Cela me renvoi un tableau ApplyMap(ID, 'MyMappingTable2') qui est vide.
Voici mon script :
MyMappingTable2 :
MAPPING LOAD
ID,
Version
FROM table2.csv
Table1et2:
LOAD
ID,
ApplyMap(ID, 'MyMappingTable2')
FROM table1.csv
;
Il me semble qu'il me manque quelques chose.
Salut,
Tu pourrais essayer le suivant:
Table1:
LOAD * INLINE [
ID, Machines
1, Machine1
2 ,Machine2
3, Machine3
4, Machine4
5, Machine5
8, Machine8
];
Table2:
LOAD * INLINE [
ID_av, ID, Version
1, 5, 7000
2, 4, 7010
3, 8, 7010
4, 3, 7005
];
LEFT JOIN (Table1)
LOAD
ID,
ID_av,
Version
RESIDENT Table2;
Drop Table Table2;
temp_table:
NoConcatenate
LOAD
ID,
Machines,
if(isnull(ID_av),'Null',ID_av) as ID_av,
if(isnull(Version),'Null',Version) as Version
RESIDENT Table1;
Drop Table Table1;
RENAME Table temp_table to Table1;
Ca fonctionner sur mon ordinateur. Si tu veux je peut te filer le qvw.
Matt
C'est exactement cela.
La proposition est d'autant plus intéressante qu'elle permet de faire un vrai LEFT JOIN et supprimer (dans mon exemple) la valeur de la seconde table, non présente dans la première.
un Right Join permettra de faire l'autres sens.
Un grand merci !
Désolé, la synthaxe de l'applymap est inversé :
ApplyMap('MyMappingTable2', ID, Null())
... le 3ème paramètre correspondant à la valeur par défaut en cas de non-association des valeurs.