Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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 :
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.
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.
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 :
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;
Les premières jointure sont correcte :
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 😉
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.
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.
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";
J'ai identifié un problème qui fausse mes résultats :
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.
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:
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:
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