9 Replies Latest reply: Aug 30, 2013 10:17 AM by David AMOSSE RSS

    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 ?

        • Re: Remplacer Null par une valeur dans un left join

          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.

          • Re: Remplacer Null par une valeur dans un left join
            Richard Pressanti

            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 ;

             

            • Re: Remplacer Null par une valeur dans un left join
              Almamy DIABY

              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

              • Re: Remplacer Null par une valeur dans un left join
                David AMOSSE

                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

                • Re: Remplacer Null par une valeur dans un left join
                  Christophe Brault

                  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                                        

                    • Re: Remplacer Null par une valeur dans un left join

                      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

                        • Re: Remplacer Null par une valeur dans un left join
                          Christophe Brault

                          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 !

                          • Re: Remplacer Null par une valeur dans un left join

                            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 ?