Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

remplacer Null par une valeur dans un left join

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 ?

1 Solution

Accepted Solutions
Not applicable
Author

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

View solution in original post

5 Replies
matthieu_burel
Luminary Alumni
Luminary Alumni

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

;

Anonymous
Not applicable
Author

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

IDMachines
1Machine1
2Machine2
3Machine3
4Machine4
5Machine5
8Machine8


Voici ma table2

ID_avIDVersion
157000
247010
387010
437005

SI je charge mes tables par un script classique, j'obtiens (et c'est juste):

IDID_avMachinesVersion
1-
Machine1-
2-
Machine2-
34Machine37005
42Machine47010
51Machine57000
83-
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.

Not applicable
Author

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

Anonymous
Not applicable
Author

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 !

matthieu_burel
Luminary Alumni
Luminary Alumni

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.