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