Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
j'aurais une question concernant les jointures dans le script de Qlik Sense.
Il faudrait que j'arrive à joindre les dates de deux tables. Mais si dans la table A je n'ai pas de date pour un mois donnée alors que j'ai ce mois pour les dates factures je dois conserver ce mois avec un montant null pour les engagement. Et inversement si je n'ai pas ce mois dans les factures mais que je l'ai dans les engagements alors je dois le garder et avoir une valeur de facture null.
Je vous met un exemple pour comprendre ce que je veux
Table A : Engagement
Date eng | Montant eng |
Janv. 2024 | 10 |
Fev. 2024 | 20 |
Fev. 2024 | 5 |
Avril. 2024 | 30 |
Table B : Facture
Date fac | Montant fac |
Fev. 2024 | 15 |
Mars. 2024 | 15 |
Mars. 2024 | 5 |
Et je voudrais une table comme ceci à la fin:
Date | Montant eng | Montant fac |
Janv. 2024 | 10 | - |
Fev. 2024 | 25 | 15 |
Mars. 2024 | - | 20 |
Avril. 2024 | 30 | 30 |
Merci d'avance ^^
Sylvain
Bonjour Sylvain,
Pour réaliser cette jointure en Qlik Sense, il vous faut faire une jointure complète (full outer join). Vous pouvez obtenir le même résultat en utilisant une combinaison de left join, right join et union.
Voici comment vous pouvez procéder :
1. Chargez les deux tables dans Qlik Sense.
2. Effectuez une jointure gauche (left join) de la table des engagements sur la table des factures.
3. Effectuez une jointure droite (right join) de la table des engagements sur la table des factures.
4. Utilisez une union pour combiner les résultats des deux jointures.
Voici un exemple de script pour Qlik Sense :
// Chargement des données des engagements
Engagements:
LOAD * INLINE [
Date eng, Montant eng
Janv. 2024, 10
Fev. 2024, 20
Fev. 2024, 5
Avril. 2024, 30
];
// Chargement des données des factures
Factures:
LOAD * INLINE [
Date fac, Montant fac
Fev. 2024, 15
Mars. 2024, 15
Mars. 2024, 5
];
// Jointure gauche des engagements sur les factures
LEFT JOIN (Factures)
LOAD
[Date eng] as Date,
Sum([Montant eng]) as [Montant eng]
RESIDENT Engagements
GROUP BY [Date eng];
// Renommage des colonnes pour la jointure droite
RENAME FIELD [Date eng] TO Date;
RENAME FIELD [Montant eng] TO [Montant eng temp];
// Jointure droite des engagements sur les factures
RIGHT JOIN (Factures)
LOAD
[Date] as Date,
[Montant eng temp] as [Montant eng]
RESIDENT Engagements;
// Union des résultats des deux jointures
FinalTable:
LOAD
Date,
Sum([Montant eng]) as [Montant eng],
Sum([Montant fac]) as [Montant fac]
RESIDENT Factures
GROUP BY Date;
DROP TABLE Engagements;
DROP TABLE Factures;
Cela vous donnera une table finale avec toutes les dates des deux tables d'origine, et des montants null où il n'y a pas de correspondance.
J'espère que cela vous aide. Désolé pour mon français, ça fait longtemps et j'ai eu l'aide d'un traducteur pour que cela sonne mieux.
Bonjour @igoralcantara
Tout d'abord, merci pour votre retour. J'ai exécuté le script que vous m'avez proposé, mais je suis face à une erreur.
Merci pour votre retour. Il semble que le problème persiste. Voici une version révisée du script pour éviter les conflits de renommage et gérer correctement la jointure et l'agrégation :
// Chargement des données des engagements
Engagements:
LOAD * INLINE [
Date eng, Montant eng
Janv. 2024, 10
Fev. 2024, 20
Fev. 2024, 5
Avril. 2024, 30
];
// Chargement des données des factures
Factures:
LOAD * INLINE [
Date fac, Montant fac
Fev. 2024, 15
Mars. 2024, 15
Mars. 2024, 5
];
// Agrégation des engagements par mois
AggregatedEngagements:
LOAD
[Date eng] as Date,
Sum([Montant eng]) as [Montant eng]
RESIDENT Engagements
GROUP BY [Date eng];
// Agrégation des factures par mois
AggregatedFactures:
LOAD
[Date fac] as Date,
Sum([Montant fac]) as [Montant fac]
RESIDENT Factures
GROUP BY [Date fac];
// Combinaison des deux tables en utilisant une approche de jointure complète (full outer join)
ConcatenatedTables:
LOAD
Date,
[Montant eng],
Null() as [Montant fac]
RESIDENT AggregatedEngagements;
CONCATENATE (ConcatenatedTables)
LOAD
Date,
Null() as [Montant eng],
[Montant fac]
RESIDENT AggregatedFactures;
// Agrégation de la table combinée pour gérer les dates en double
FinalTable:
LOAD
Date,
Sum([Montant eng]) as [Montant eng],
Sum([Montant fac]) as [Montant fac]
RESIDENT ConcatenatedTables
GROUP BY Date;
// Suppression des tables intermédiaires inutiles
DROP TABLE AggregatedEngagements;
DROP TABLE AggregatedFactures;
DROP TABLE ConcatenatedTables;
Merci beaucoup pour ce code révisé. Excellente journée à vous