8 Replies Latest reply: Mar 17, 2017 4:28 AM by Sébastien Fatoux RSS

    Qlik Sense : Combiner 3 table

    Alexandre Lepinet

      Bonjour à tous,

       

      Je cherche à rassembler des champs de 3 tables différentes, dans une seule et même table.

      J'ai essayé d'enchaîner plusieurs INNER JOIN, ce qui ne doit pas être possible puisque Qlik me renvoie une erreur.

       

      Modèle de données :

       

      Modèle de données.png

      Code essayé :

       

      Enseigne:
      LOAD
        "Trigramme" as "last_sec_trigramme",
          "Code IRT" as "last_sec_code"
      RESIDENT "Tests PCA";
      INNER JOIN
      LOAD
        "Enseigne utilisatrice" as "Enseigne utilisatrice 2",
          "Application secourue" as "Application secourue 2"
      RESIDENT "Infos KAT";
      INNER JOIN
      LOAD
        "last_sec_max" as "last_sec_max_2",
          "last_sec_qualité" as "last_sec_qualité_2"
      RESIDENT "Derniers tests de secours";
      LOAD *,
        if(
        "Application secourue 2"='Oui' and
          "last_sec_max_2" > '01/01/2016' and
          ("last_sec_qualité_2"='Bronze'  //CREATION GroupeQualité
          or "last_sec_qualité_2"='Argent'
          or "last_sec_qualité_2"='Or'
          or "last_sec_qualité_2"='Platinum'
          or "last_sec_qualité_2"='Validé'
          or "last_sec_qualité_2" = 'Non certifié'), Dual('Testée', 1),
            if("Application secourue 2"='Non', Dual('Non secourue', 2),'Non testée')
        ) as Résultat_test
      RESIDENT "Enseigne";
      
      
      
      

       

      Merci pour votre aide.

        • Re: Qlik Sense : Combiner 3 table
          Sébastien Fatoux

          Tu n'as pas précisé quel était ton message d'erreur.

           

          Tu cherches à joindre  des tables qui n'ont aucun lien entre elles !!!

          Pour réaliser des Inner Join, il te faut des champs en commun qui vont te servir de clé de jointure.

           

          Pour quel raison veux-tu joindre ces 3 tables? Quel résultat attends-tu?

           

          Ce n'est peut-être pas une jointure qu'il te faut.

            • Re: Qlik Sense : Combiner 3 table
              Alexandre Lepinet

              Bonjour Sébastien,

               

              En vérité, je suis forcé d'abandonner à un moment le chargement des données pour éviter le plantage complet de Qlik, qui se fige au bout d'un certain temps de chargement.

              Je récupère quand même le message d'erreur suivant :

              L'erreur suivante s'est produite:

              Action canceled by user

              Emplacement de l'erreur:

              INNER JOIN LOAD "last_sec_max" as "last_sec_max_2", "last_sec_qualité" as "last_sec_qualité_2" RESIDENT "Derniers tests de secours"

               

              Les tables que je veux joindre ont pour moi les champs "last_sec_trigramme" et "last_sec_code" en commun.

               

              Je cherche en faite à utiliser le code que tu m'as donné dans un précédent topic. Le but final est de pouvoir produire directement dans Qlik ce genre chose, pour le moment réalisées sous excel :

              tableau.png

              histo.png

               

              Voici mon code complet, peut être n'ai-je pas bien saisi l'utilisation des jointures :

              "Tests PCA" :
              LOAD
                  "Trigramme",
                  "Code IRT",
                  "Date du test",
                  "Date de fin du test",
                  "Qualité",
                  "Type d'opération"
              FROM [lib://Documents/Extract_PCA_applications10012017-16_33_07.csv]
              (txt, codepage is 1252, embedded labels, delimiter is ';', msq);
              
              
              "Derniers tests de secours":
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code", 
                  Date(Max("Date du test")) as "last_sec_max" 
              RESIDENT "Tests PCA"
              WHERE "Date du test" < '01/01/2017'
              GROUP BY "Trigramme","Code IRT";
              INNER JOIN
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code",
                  "Date du test" as "last_sec_max",
                  "Qualité" as "last_sec_qualité",
                  "Type d'opération" as "last_sec_type d'opération"
              RESIDENT "Tests PCA"
              WHERE "Type d'opération" like '*secours';
              
              
              "Futurs tests de secours":
              LOAD 
                "Trigramme" as "next_sec_trigramme",
                  "Code IRT" as "next_sec_code", 
                  Date(Max("Date du test")) as "next_sec_max" 
              RESIDENT "Tests PCA"
              WHERE "Date du test" < '01/01/2018' and "Date du test" > '01/01/2017'
              GROUP BY "Trigramme","Code IRT";
              INNER JOIN
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code",
                  "Date du test" as "next_sec_max",
                  "Type d'opération" as "next_sec_type d'opération"
              RESIDENT "Tests PCA"
              WHERE "Type d'opération" like '*secours';
              
              
              "Derniers tests de robustesse":
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code", 
                  Date(Max("Date du test")) as "last_rob_max" 
              RESIDENT "Tests PCA"
              WHERE "Date du test" < '01/01/2017'
              GROUP BY "Trigramme","Code IRT";
              INNER JOIN
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code",
                  "Date du test" as "last_rob_max",
                  "Qualité" as "last_rob_qualité",
                  "Type d'opération" as "last_rob_type d'opération"
              RESIDENT "Tests PCA"
              WHERE "Type d'opération" like '*robustesse';
              
              
              "Futurs tests de robustesse":
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code", 
                  Date(Max("Date du test")) as "next_rob_max" 
              RESIDENT "Tests PCA"
              WHERE "Date du test" < '01/01/2018' and "Date du test" > '01/01/2017'
              GROUP BY "Trigramme","Code IRT";
              INNER JOIN
              LOAD 
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code",
                  "Date du test" as "next_rob_max",
                  "Type d'opération" as "next_rob_type d'opération"
              RESIDENT "Tests PCA"
              WHERE "Type d'opération" like '*robustesse';
              
              
              "Infos KAT" :
              LOAD
                  "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code",
                  "AM",
                  "ISM dédié",
                  "Application secourue",
                  "Cluster",
                  "État",
                  "Type de composant",
                  "Criticité STAMP",
                  "Monde",
                  "Enseigne utilisatrice"
              FROM [lib://Documents/export_global_10012017-16_32_25.csv]
              (txt, codepage is 1252, embedded labels, delimiter is ';', msq);
              
              
              
              
              Enseigne:
              LOAD  
                "Trigramme" as "last_sec_trigramme",
                  "Code IRT" as "last_sec_code"
              RESIDENT "Tests PCA";
              INNER JOIN
              LOAD
                "Enseigne utilisatrice" as "Enseigne utilisatrice 2",
                  "Application secourue" as "Application secourue 2"
              RESIDENT "Infos KAT";
              INNER JOIN
              LOAD 
                "last_sec_max" as "last_sec_max_2",
                  "last_sec_qualité" as "last_sec_qualité_2"
              RESIDENT "Derniers tests de secours";
              LOAD *,
                if(
                "Application secourue 2"='Oui' and
                  "last_sec_max_2" > '01/01/2016' and
                  ("last_sec_qualité_2"='Bronze'  //CREATION GroupeQualité
                  or "last_sec_qualité_2"='Argent' 
                  or "last_sec_qualité_2"='Or'
                  or "last_sec_qualité_2"='Platinum'
                  or "last_sec_qualité_2"='Validé'
                  or "last_sec_qualité_2" = 'Non certifié'), Dual('Testée', 1),
                    if("Application secourue 2"='Non', Dual('Non secourue', 2),'Non testée')
                 ) as Résultat_test
              RESIDENT "Enseigne";
              
              
              
              
              tmpDistinctEnseigne:
              LOAD Distinct 
                   "Enseigne utilisatrice 2" as DistinctEnseigne
              Resident Enseigne;
              
              
              tmpCritèreGroupe:
              LOAD * Inline [
                   Critère, Groupe
                   *BDDF*, BDDF
                   *DC*, BSC
                   *Groupe*, BSC
                   *Réseau*, BSC
                   *BSC*, BSC
                   *Ligne Métier*, BSC
                   *Pôle*, BSC
                   *RBDF*, BSC
                   *RESG*, BSC
                   *GTPS*, GTPS
                   *CDN*, CDN
                   *IBFS*, IBFS
                   *FRANFINANCE*, FRANFINANCE
                   *TRANSACTIS*, GTPS
                   Cellule_Vide, Cellule_Vide
              ];
              
              
              
              
              //Initialisation de la structure
              tmpGroupe:
              LOAD * 
              INLINE [
                   EnseigneGroupée, Groupe
              ];
              
              
              LET ligneCritereGroupe = NoOfRows('tmpCritèreGroupe');
              
              
              FOR i=0 to $(ligneCritereGroupe)-1 // parcourt toutes les ligne
              
              
                   LET vCritère = Peek('Critère',$(i), 'tmpCritèreGroupe');
                   LET vGroupe = Peek('Groupe',$(i), 'tmpCritèreGroupe'); 
              
              
                   Concatenate(tmpGroupe)
                   LOAD
                       DistinctEnseigne as EnseigneGroupée,
                       '$(vGroupe)' as Groupe
                   Resident 
                       tmpDistinctEnseigne
                   Where
                       DistinctEnseigne like '$(vCritère)';
              NEXT
              
              
              Concatenate(tmpGroupe)
              LOAD
                   DistinctEnseigne as EnseigneGroupée,
                   'Autres' as Groupe
              Resident 
                   tmpDistinctEnseigne
              Where
                   not Exists(EnseigneGroupée, DistinctEnseigne);
              
              
              
              
              Left Join(Enseigne)
              LOAD
                   EnseigneGroupée as "Enseigne utilisatrice 2", // key
                  Groupe 
              Resident tmpGroupe;
              
              
              DROP Table tmpGroupe;
              DROP Table tmpCritèreGroupe;
              DROP Table tmpDistinctEnseigne;
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
                • Re: Qlik Sense : Combiner 3 table
                  Sébastien Fatoux

                  Les premières jointure sont correcte :

                  Community_1226369_1.png

                  Community_1226369_2.png

                  Community_1226369_3.png

                  Community_1226369_4.png

                   

                  par contre les 2 suivantes ne sont pas correcte, car elles n'ont aucun champs en commun et dans ce cas, QlikView crée un produit cartésien, il associe chaque ligne de la 1èere table à chaque ligne de la seconde table. Donc si on a 1'200 lignes dans la première et 2'300 lignes dans la seconde, on va au final se retrouver avec 2'760'000.

                  Et dans ton cas, tu enchaines avec un second produit cartésien avec une troisième table.

                  ==> C'est pour cela que Qlik Sense part dans les choux ;-)

                   

                  Community_1226369_5.png

                  Community_1226369_6.png

                    • Re: Qlik Sense : Combiner 3 table
                      Alexandre Lepinet

                      Merci, ça m'a aidé à comprendre un peu mieux le fonctionnement des jointures. J'ai donc modifié mon code mais ai toujours un problème.

                       

                      Enseigne:
                      LOAD  
                        "Trigramme" as "last_sec_trigramme",
                          "Code IRT" as "last_sec_code"
                      RESIDENT "Tests PCA";
                      INNER JOIN 
                      LOAD
                        "last_sec_trigramme",
                          "last_sec_code",
                        "Enseigne utilisatrice" as "Enseigne utilisatrice 2",
                          "Application secourue" as "Application secourue 2"
                      RESIDENT "Infos KAT";
                      INNER JOIN 
                      LOAD 
                        "last_sec_trigramme",
                          "last_sec_code",
                        "last_sec_max" as "last_sec_max_2",
                          "last_sec_qualité" as "last_sec_qualité_2"
                      RESIDENT "Derniers tests de secours";
                      INNER JOIN
                      LOAD 
                        "last_sec_trigramme",
                          "last_sec_code",
                        if(
                        "Application secourue 2"='Oui' and
                          "last_sec_max_2" > '01/01/2016' and
                          ("last_sec_qualité_2"='Bronze'  //CREATION GroupeQualité
                          or "last_sec_qualité_2"='Argent' 
                          or "last_sec_qualité_2"='Or'
                          or "last_sec_qualité_2"='Platinum'
                          or "last_sec_qualité_2"='Validé'
                          or "last_sec_qualité_2" = 'Non certifié'), Dual('Testée', 1),
                            if("Application secourue 2"='Non', Dual('Non secourue', 2),'Non testée')
                         ) as Résultat_test
                      RESIDENT "Enseigne";
                      

                       

                      En chargeant la dernière partie (à partir de la ligne 21), ma table passe de 2543 à 23001 lignes, alors que ça ne devrait pas changer.

                        • Re: Qlik Sense : Combiner 3 table
                          Sébastien Fatoux

                          Je pense que ta table doit grossir déjà avant la ligne 21.

                           

                          Si le nombre de ligne augmente lors d'une jointure c'est que les clé de jointure ne sont pas unique dans une des 2 tables jointes ou dans les 2.

                           

                          Avec un INNER JOIN, tu peux également perdre des lignes si la combinaison de tes clé de jointure n'existe pas dans les tables jointes

                           

                          Essaye déjà simplement d'ajouter pour ces requêtes le mot clé Distinct après les LOAD.

                            • Re: Qlik Sense : Combiner 3 table
                              Alexandre Lepinet

                              Bonjour Sébastien,

                               

                              J'ai finalement pas mal changé le bout de code qui posait problème et me rapproche des résultats réels. Je n'ai pas utilisé distinct qui réduisait bien mon nombre de lignes mais ne semblait pas correspondre aux résultats que je cherchais.

                              "Derniers tests de secours bis":  //anciennement Enseigne
                              LOAD
                                "last_sec_trigramme",
                                  "last_sec_code",
                                  "last_sec_max" as "last_sec_max_2",
                                  "last_sec_qualité" as "last_sec_qualité_2",
                                  "last_sec_type d'opération" as "last_sec_type d'opération_2"
                              RESIDENT "Derniers tests de secours";
                              INNER JOIN 
                              LOAD
                                "last_sec_trigramme",
                                  "last_sec_code",
                                "Enseigne utilisatrice" as "Enseigne utilisatrice 2",
                                  "Application secourue" as "Application secourue 2"
                              RESIDENT "Infos KAT";
                              INNER JOIN
                              LOAD
                                "last_sec_trigramme",
                                  "last_sec_code",
                                if([Application secourue 2]='Non','Sans Secours',
                                if(last_sec_max_2 > '01/01/2016'  
                                    and ("last_sec_qualité_2"='Bronze'
                                  or "last_sec_qualité_2"='Argent' 
                                  or "last_sec_qualité_2"='Or'
                                  or "last_sec_qualité_2"='Platinum'
                                  or "last_sec_qualité_2"='Validé'
                                           ),'Application validée',
                                           'Aucun test de secours')
                                           ) as Résultat_test
                              RESIDENT "Derniers tests de secours bis";
                              

                               

                              modele.png

                               

                              J'ai identifié un problème qui fausse mes résultats :

                              resultat.png

                              Sur certaines lignes, les données n'ont pas été chargées pour plusieurs champs dont "Enseigne utilisatrice 2" qui sert ensuite à déterminer le champs "Groupe" sur lequel mes chiffres finaux se basent.

                              Vois-tu d'où vient le problème ?

                               

                              Merci encore pour ton aide.

                                • Re: Qlik Sense : Combiner 3 table
                                  Sébastien Fatoux

                                  Si les combinaisons de tes champs "last_sec_trigramme" et "last_sec_code" pour lesquelles "Enseigne utilisatrice 2" est vide, n'existe pas dans une des 2 tables ci-dessous c'est normale, le inner join ne gardant que les combinaisons commune au 2 tables:

                                  • Derniers tests de secours
                                  • Infos KAT

                                   

                                  Il ne faut pas oublier que des combinaisons de tes champs "last_sec_trigramme" et "last_sec_code" peuvent exister dans les autres tables les contenant:

                                  • Futurs tests de robustesse
                                  • Derniers tests de robustesse
                                  • Futurs tests de secours
                                    • Re: Qlik Sense : Combiner 3 table
                                      Sébastien Fatoux

                                      Bonjour,

                                       

                                      Si des réponses vous ont aidés, merci de les spécifier comme "Utile".

                                      Si vous désirez recommander une réponse aux autres membre de la communauté, cliquez sur recommander.

                                      Et si la réponse résout votre problème, merci de mettre la question comme résolue, afin d'aider les autres membres de la communauté.

                                       

                                      Merci