Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Qlik Sense : Combiner 3 table

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.

Labels (1)
8 Replies
sfatoux72
Partner - Specialist
Partner - Specialist

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.

Not applicable
Author

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;

sfatoux72
Partner - Specialist
Partner - Specialist

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

Not applicable
Author

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.

sfatoux72
Partner - Specialist
Partner - Specialist

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.

Not applicable
Author

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.

sfatoux72
Partner - Specialist
Partner - Specialist

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
sfatoux72
Partner - Specialist
Partner - Specialist

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