Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Remplacer Null par une valeur dans un left join

Bonjour,

J'ai eu du mal à classer cette question au bon endroit, j'espère n'avoir pas trop fait de doublon.

Je rencontre un problème pourtant simple, sur lequel j'ai trouvé des réponses mais je n'arrive pas à les mettre en œuvre :

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és 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 champs de liaison portent 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
christophebrault
Specialist
Specialist

Bonjour,

Dans votre cas, vous pouvez aussi très bien utiliser un mapping directement dans le chargement de votre table employes. cette méthode a pour avantage d'être claire dans le script en limitant le nombre de chargement de tables :

// Création de la table de mappage à partir du fichier Service

// Doit contenir obligatoirement 2 champs

MAP_SERVICE:

MAPPING LOAD

No_Employe,

Service

FROM Service.xls...

// CHARGEMENT DES EMPLOYES

EMPLOYE:

LOAD NoEmploye,

          Nom_Employe,

          ApplyMap('MAP_SERVICE',NoEmploye,'Sans Service') // Applique le mappage à partir du NoEmploye

// Si NoEmploye n'est pas trouvé dans la table service, la valeur par défaut 'Sans Service' est appliquée

FROM Employe.xls                                        

Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin

View solution in original post

9 Replies
Not applicable
Author

Je suis absent(e) du bureau jusqu'au 26/08/2013

I am out of the office and get back to you when I return.

Remarque : ceci est une réponse automatique à votre message "[Groupe des

Utilisateurs Francophones] - Remplacer Null par une valeur dans un left

join" envoyé le 24/8/2013 10:36:37.

C'est la seule notification que vous recevrez pendant l'absence de cette

personne.

This message and any attachments (the "message") is

intended solely for the intended addressees and is confidential.

If you receive this message in error,or are not the intended recipient(s),

please delete it and any copies from your systems and immediately notify

the sender. Any unauthorized view, use that does not comply with its purpose,

dissemination or disclosure, either whole or partial, is prohibited. Since the internet

cannot guarantee the integrity of this message which may not be reliable, BNP PARIBAS

(and its subsidiaries) shall not be liable for the message if modified, changed or falsified.

Do not print this message unless it is necessary,consider the environment.

rlp
Creator
Creator

Il vous faut définir un MAPPING ( Cf. Reference  Manyal) et, pour réaliser la substitution, forcer l'évaluation avec un RIGHT JOIN d'où le code:

mapping_service :

MAPPING LOAD

     Null() as old ,

     'sans_service' as new

AUTOGENERATE( 1 ) ;

MAP service USING mapping_service ;

Employes:

noConcatenate

LOAD

     *

FROM Employes

;

LEFT JOIN( Employes )

LOAD DISTINCT

     *

FROM Services ;

RIGHT JOIN( Employes )

LOAD

     *

RESIDENT Employes ;

almamy_diaby
Creator
Creator

Bonjour,

EMPLOYE:

load

No_employe,

Nom_employe

From Employe ;

join

SERVICE:

load

No_employe,

Service

from Service;

Noconcatanate

Table_Employe_service:

No_employe,

Nom_employe,

if(len(Service)=0,'sans_service',Service) as Service

resident EMPLOYE;

Drop table EMPLOYE;

Normalement si tu exécute se script dans l'ordre ,tu auras le résultat que tu cherches.

Au niveau du from des tables EMPLOYE et SERVICE, précise le bon chemin 

et la bonne extension du fichier

Not applicable
Author

Bonjour,

Ceci fonctionne :

T_Employes:

LOAD * INLINE

[

    ID_Employe, nom_Employe

    1, Georges

    2, Martha

    3, Robert

]

;

left join

T_Services:

LOAD * INLINE

[

    ID_Service, ID_Employe, nom_Service

    1, 1, Administration

    2, 3, Technique

]

;

T_NewEmployes:

LOAD

    //Si besoin ID_Employe et ID_Service

    nom_Employe AS NOM_EMPLOYE,

    if(IsNull(nom_Service), 'Pas de Service', nom_Service) AS SERVICE

Resident T_Employes

;

DROP Table T_Employes;

Cordialement

DAAM

christophebrault
Specialist
Specialist

Bonjour,

Dans votre cas, vous pouvez aussi très bien utiliser un mapping directement dans le chargement de votre table employes. cette méthode a pour avantage d'être claire dans le script en limitant le nombre de chargement de tables :

// Création de la table de mappage à partir du fichier Service

// Doit contenir obligatoirement 2 champs

MAP_SERVICE:

MAPPING LOAD

No_Employe,

Service

FROM Service.xls...

// CHARGEMENT DES EMPLOYES

EMPLOYE:

LOAD NoEmploye,

          Nom_Employe,

          ApplyMap('MAP_SERVICE',NoEmploye,'Sans Service') // Applique le mappage à partir du NoEmploye

// Si NoEmploye n'est pas trouvé dans la table service, la valeur par défaut 'Sans Service' est appliquée

FROM Employe.xls                                        

Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin
Anonymous
Not applicable
Author

Je croule sous les réponses, elles fonctionnent toutes !

Merci !

cette solution (le Mapping) est très intéressante pour une volume de table me semble-t-il limité (ici, quelques services)

Peut être que si la table services était très volumineuse (dans un autres cas d'utilisation) , les solutions exprimées par ailleurs dans ce ticket sont meilleures (par exemple les pointages horaires d'un employés qui pourraient être nulles et qui manquerait).

A choisir en fonction du contexte donc.

Merci encore

christophebrault
Specialist
Specialist

Merci.

Je n'ai pas fait de test de performance, mais j'utilise aussi cette méthode avec de plus grosse table de mappage (20 000+).

La grosse différence avec le left join c'est qu'on ne peut ramener qu'un seul champs de cette manière. Donc dès qu'on veut 2 champs, le left join est préférable.

Le risque du left join est que si il existe 2 valeur différente pour un seule (2 service pour un même NoEmploye), les lignes sont doublés. Donc faire attention d'avoir des valeurs uniques !

Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin
Anonymous
Not applicable
Author

J'essaie donc de mettre en place cette solution sauf que le chargement de ma table EMPLOYE n'est pas dans un fichier xls mais une base de données.

Du coup :

//Chargement employés

ODBC CONNECT TO [Glpi sur 8.37];

EMPLOYE:

SQL SELECT ID,

    NoEmploye,

    ApplyMap('Mapservice',NoEmploye,'Sans Service')

FROM sami.`glpi_employes`;

ne fonctionne pas

sami.ApplyMap does not exist

La fonction Applymap ne peut pas être utilisés dans ce cas ?

Not applicable
Author

Si,

mais charge ta table sans mettre le ApplyMap pour l'instant :

ODBC CONNECT TO [Glpi sur 8.37];

EMPLOYE:

SQL SELECT ID,

    NoEmploye,

    NoEmploye

FROM sami.`glpi_employes`;

Ensuite fais

NEWEMPLOYE:

LOAD

NoEmploye,

    ApplyMap('Mapservice',NoEmploye,'Sans Service')

Resident EMPLOYE;

DROP TABLE EMPLOYE,

Ca devrait marcher.

DAAM