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

Left join avec condition

Bonjour à tous,

 

j'ai une problématique je n'arrive pas à résoudre :

- J'ai une table A qui contient les champs suivants ID | DT_VALEUR :

TabA :
LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];

 

- Une table B qui contient les champs suivants ID | DT_DEB_VALEUR | DT_FIN_VALEUR

TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR
1, 01/01/2019, 31/01/2022
1, 01/01/2023, 03/01/2023
1, 04/01/2023, 24/06/2023
2, 01/02/2020, 31/03/2023
2, 01/04/2023, 31/12/2024
];

 

Je souhaiterai créer une 3ème table (TabC par exemple) afin de conserver les éléments de TabA + ne ramener que les lignes de TabB lorsque la DT_VALEUR de TabA est comprise entre les valeurs DT_DEB_VALEUR et DT_FIN_VALEUR de la table B.


TabC :
NoConcatenate
LOAD *
Resident TabA ;


LEFT JOIN
NoConcatenate
LOAD *
Resident TabB
where DT_VALEUR <= DT_DEB_VALEUR
and DT_VALEUR >= DT_FIN_VALEUR ;

 

Sauf que cela me génère une erreur en me disant que le champ "DT_VALEUR" est introuvable (ce qui est effectivement logique puis qu'il n'existe pas dans TabB).

Merci par avance pour votre aide

1 Solution

Accepted Solutions
Dref278
Creator
Creator

Bonjour Briinou,

La solution passe par l'utilisation de la fonction IntervalMatch(), dont la syntaxe n'est pas des plus simple.

Je t'invite à regarder cet exemple de mise  en oeuvre :

https://www.youtube.com/watch?v=oxQgqXT63gU

Cdlt

Pour avoir une bonne réponse, il faut poser la bonne question (Chat GPT, 2023)

View solution in original post

4 Replies
Dref278
Creator
Creator

Bonjour Briinou,

La solution passe par l'utilisation de la fonction IntervalMatch(), dont la syntaxe n'est pas des plus simple.

Je t'invite à regarder cet exemple de mise  en oeuvre :

https://www.youtube.com/watch?v=oxQgqXT63gU

Cdlt

Pour avoir une bonne réponse, il faut poser la bonne question (Chat GPT, 2023)
Briinou
Contributor III
Contributor III
Author

Hello,
Effectivement, l'utilisation de IntervalMatch n'est pas très intuitive, mais la solution fonctionne et est très efficace sur le nombre de lignes que je traite !

Merci beaucoup pour la découverte de la fonction ! 😄

 

Le script de la solution :

TabA :
LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];


TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR1, VALEUR2
1, 01/01/2019, 31/01/2022, '01/01/19 > 31/01/22', 'Blabla'
1, 01/01/2023, 03/01/2023, '01/01/23 > 03/01/23',' Bloblo'
1, 04/01/2023, 24/06/2023, '01/01/23 > 03/01/23', 'Blublu'
2, 01/02/2020, 31/03/2023, '01/02/20 > 31/03/23', 'Abracadabra'
2, 01/04/2023, 31/12/2024, '01/04/23 > 31/12/24', 'Plouf'
];

 

IntervalMatch_TABLE :
IntervalMatch(DT_VALEUR, ID)
LOAD DT_DEB_VALEUR, DT_FIN_VALEUR, ID Resident TabB;
LEFT JOIN LOAD ID, DT_VALEUR Resident TabA;
LEFT JOIN LOAD ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR1, VALEUR2 Resident TabB;

DROP TABLES TabA, TabB;

 

 

Merci 😉

Dref278
Creator
Creator

Briinou,

Pour avoir un résultat propre, et si le fait d'avoir une seule table te convient  il faut simplement supprimer la table B ( "drop table TabB;" à la fin du script)

Si par contre tu souhaites conserver 2 tables différentes ce script devrait t'aider :

LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];


TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR
1, 01/01/2019, 31/01/2022, '01/01/19 > 31/01/22'
1, 01/01/2023, 03/01/2023, '01/01/23 > 03/01/23'
1, 04/01/2023, 24/06/2023, '01/01/23 > 03/01/23'
2, 01/02/2020, 31/03/2023, '01/02/20 > 31/03/23'
2, 01/04/2023, 31/12/2024, '01/04/23 > 31/12/24'
];

TabC:
IntervalMatch(DT_VALEUR, ID)
LOAD DT_DEB_VALEUR
, DT_FIN_VALEUR
, ID
Resident TabB;

drop Table TabB;

 

Cdlt,

Pour avoir une bonne réponse, il faut poser la bonne question (Chat GPT, 2023)
Briinou
Contributor III
Contributor III
Author

Hello,

Top ! Je venais de trouver la réponse de mon côté en même temps que ton retour.
C'est parfait, un grand merci 😉