Qlik Community

Groupe des Utilisateurs Francophones

Vous êtes francophone? Ce groupe est pour vous. Venez découvrir comment démarrer avec Qlik Sense et QlikView, poser vos questions et partager vos tutos et astuces avec les membres de notre communauté.

Highlighted
borislepage
Not applicable

Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Bonjour à tous,

Désolé pour le titre un peu bancal, j'ai eu du mal à synthétiser ma demande sur le titre.

Le contexte :

Je suis en train de faire une application sur la promotion, hors nous faisons en interne quelques rajouts manuels qui ne sont pas correctement intégrés dans la base de données.

Tables disponibles :

- Table 1 : Détail_Commande

     - champs : Num_cde

                     Point_de_vente

                     Code_produit

                     Date_création_cde

                     Date_retrait_cde

                     Flag_promo ("0" pas de promo / "1" promo présente)

                     Type_remise (contient différentes valeurs "Remise A" / "Remise B" / "Remise C" / "Remise D")

                     ...

- Table 2 :  Table Remise Manuelle

     - champs : Code_produit

                     Point_de_vente

                     Date_début_promo

                     Date_fin_promo

                     Type_remise_2 (contient deux valeurs différentes : "Remise E" / vide)

                    

Attendus :

J'aimerais liés les deux tables de manière à n'avoir qu'une seule dimension  "type de remise" qui intégrerais les remise "A,B,C,D et E"

Le problème que je rencontre c'est que la remise "E" doit être valide uniquement dans les cas suivant

- Code produit identique entre les deux tables

- Point_de_vente identique entre les deux tables

- Date_création_cde compris entre Date_début_promo et Date_fin_promo

Merci d'avance pour votre aide

Tags (1)
1 Solution

Accepted Solutions
sfatoux72
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Bonjour,

Essayer comme ceci :

SET DateFormat='DD.MM.YYYY';

Detail_commande:
LOAD * INLINE [
Num_cde, Point_de_vente, Code_produit, Date_création_cde, Date_retrait_cde, Flag_promo, Type_remise
1, AAA, aaa, 03.01.2017, 05.01.2017, 1, Remise A
2, AAA, aaa, 21.01.2017, 22.01.2017, 0,
3, BBB, aaa, 21.01.2017, 22.01.2017, 0,
4, AAA, bbb, 21.01.2017, 22.01.2017, 0,
5, AAA, aaa, 03.02.2017, 05.02.2017, 1, Remise B
6, AAA, aaa, 21.02.2017, 22.02.2017, 0
]
;

Remise_Manuelle:
LOAD * INLINE [
Point_de_vente, Code_produit, Date_début_promo, Date_fin_promo, Type_remise_2, tmp
AAA, aaa, 01.01.2017, 31.01.2017, Remise E, xxx
]
;

RENAME Field Type_remise to Type_remise_1;

inner join(Remise_Manuelle)
IntervalMatch (Date_création_cde, Point_de_vente, Code_produit)
LOAD Date_début_promo, Date_fin_promo, Point_de_vente, Code_produit
Resident Remise_Manuelle;

Left join(Detail_commande)
LOAD
Date_création_cde, // Join key
Point_de_vente, // Join key
Code_produit, // Join key
Type_remise_2
Resident Remise_Manuelle;

DROP Table Remise_Manuelle;

Left join(Detail_commande)
LOAD
Num_cde,
if(Flag_promo=0, Type_remise_2, Type_remise_1) as Type_remise
Resident Detail_commande;

DROP Fields Type_remise_1, Type_remise_2;

8 Replies
sfatoux72
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Dans les condition de validité de la remise E, vous n'avez pas parlé du Flag_promo et du Type_remise.

Si il y a déjà une promo avec Remise B, la remplace-t-on par Remise E ou est-ce qu'on a les 2 remises ou alors est-ce que la remise manuelle ne s'applique qu'aux cas sans promo ?

borislepage
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Pour répondre à votre question, la remise manuelle ne s'applique qu'aux cas sans promo

sfatoux72
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Bonjour,

Essayer comme ceci :

SET DateFormat='DD.MM.YYYY';

Detail_commande:
LOAD * INLINE [
Num_cde, Point_de_vente, Code_produit, Date_création_cde, Date_retrait_cde, Flag_promo, Type_remise
1, AAA, aaa, 03.01.2017, 05.01.2017, 1, Remise A
2, AAA, aaa, 21.01.2017, 22.01.2017, 0,
3, BBB, aaa, 21.01.2017, 22.01.2017, 0,
4, AAA, bbb, 21.01.2017, 22.01.2017, 0,
5, AAA, aaa, 03.02.2017, 05.02.2017, 1, Remise B
6, AAA, aaa, 21.02.2017, 22.02.2017, 0
]
;

Remise_Manuelle:
LOAD * INLINE [
Point_de_vente, Code_produit, Date_début_promo, Date_fin_promo, Type_remise_2, tmp
AAA, aaa, 01.01.2017, 31.01.2017, Remise E, xxx
]
;

RENAME Field Type_remise to Type_remise_1;

inner join(Remise_Manuelle)
IntervalMatch (Date_création_cde, Point_de_vente, Code_produit)
LOAD Date_début_promo, Date_fin_promo, Point_de_vente, Code_produit
Resident Remise_Manuelle;

Left join(Detail_commande)
LOAD
Date_création_cde, // Join key
Point_de_vente, // Join key
Code_produit, // Join key
Type_remise_2
Resident Remise_Manuelle;

DROP Table Remise_Manuelle;

Left join(Detail_commande)
LOAD
Num_cde,
if(Flag_promo=0, Type_remise_2, Type_remise_1) as Type_remise
Resident Detail_commande;

DROP Fields Type_remise_1, Type_remise_2;

borislepage
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Merci beaucoup pour votre aide, je n'ai pas eu le temps / courage d'essayer votre solution hier soir,

Je viens de finir d'ajouter votre script, je fais quelques test avant de marquer votre réponse comme correcte, mais à première vu cela semble correcte.

borislepage
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

Bonjour,

Je rencontre un nouveau problème sur le script,

Sur un faible volume de donnée (comme dans votre exemple) cela fonctionne parfaitement,

Lorsque le volume de donnée devient plus important la table "Detail_commande" augmente énormément de volume

Sur l'exemple ci-dessous nous avons 18 commandes, hors après l'exécution du script, la table contient 658 lignes.

Merci d'avance pour votre aide

SET DateFormat='DD.MM.YYYY';

Detail_commande:
LOAD * INLINE [
Num_cde, Point_de_vente, Code_produit, Date_création_cde, Date_retrait_cde, Flag_promo, Type_remise
1, AAA, aaa, 03.01.2017, 05.01.2017, 1, Remise A
2, AAA, aaa, 21.01.2017, 22.01.2017, 0,
3, BBB, aaa, 21.01.2017, 22.01.2017, 0,
4, AAA, bbb, 21.01.2017, 22.01.2017, 0,
5, AAA, aaa, 03.02.2017, 05.02.2017, 1, Remise B
6, AAA, aaa, 21.02.2017, 22.02.2017, 0

7, AAA, aaa, 03.01.2017, 05.01.2017, 1, Remise A

8, CCC, aaa, 21.01.2017, 22.01.2017, 0,

9, BBB, aaa, 21.01.2017, 22.01.2017, 0,

10, AAA, bbb, 21.01.2017, 22.01.2017, 0,

11, AAA, aaa, 03.02.2017, 05.02.2017, 1, Remise B

12, AAA, aaa, 21.02.2017, 22.02.2017, 0,

13, AAA, aaa, 03.01.2017, 05.01.2017, 1, Remise A

14, AAA, aaa, 21.01.2017, 22.01.2017, 0,

15, BBB, aaa, 21.01.2017, 22.01.2017, 0,

16, AAA, bbb, 21.01.2017, 22.01.2017, 0,

17, AAA, aaa, 03.02.2017, 05.02.2017, 1, Remise B

18, AAA, aaa, 21.02.2017, 22.02.2017, 0

];

Remise_Manuelle:
LOAD * INLINE [

Point_de_vente, Code_produit, Date_début_promo, Date_fin_promo, Type_remise_2, tmp

AAA, aaa, 01.01.2017, 31.01.2017, Remise E, xxx

BBB, bbb, 21.01.2017, 22.01.2017, Remise E, xxx

AAA, aaa, 01.01.2017, 31.01.2017, Remise E, xxx

AAA, bbb, 21.01.2017, 22.01.2017, Remise E, xxx

AAA, aaa, 01.01.2017, 31.01.2017, Remise E, xxx

AAA, bbb, 21.01.2017, 22.01.2017, Remise E, xxx

BBB, aaa, 01.01.2017, 31.01.2017, Remise E, xxx

AAA, bbb, 21.01.2017, 22.01.2017, Remise E, xxx

];



RENAME Field Type_remise to Type_remise_1;

inner join(Remise_Manuelle)
IntervalMatch (Date_création_cde, Point_de_vente, Code_produit)
LOAD Date_début_promo, Date_fin_promo, Point_de_vente, Code_produit
Resident Remise_Manuelle;

Left join(Detail_commande)
LOAD
Date_création_cde, // Join key
Point_de_vente, // Join key
Code_produit, // Join key
Type_remise_2
Resident Remise_Manuelle;

DROP Table Remise_Manuelle;

Left join(Detail_commande)
LOAD
Num_cde,
if(Flag_promo=0, Type_remise_2, Type_remise_1) as Type_remise
Resident Detail_commande;

DROP Fields Type_remise_1, Type_remise_2;

sfatoux72
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

C'est simplement parce que pour un même code_produit et Point_de_vente tu as a plusieurs promo sur la même période.

Je pense que ceci ne peux pas être possible.

borislepage
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

En effet ce n'est normalement pas possible sauf si le point de vente porte deux formats différents

Typiquement "Drive" & "Store"

Dans ce cas nous aurons deux lignes identiques, sauf pour le format

Donc si je comprend il faut que j'intègre le type de format dans "IntervalMatch"

EDIT


Sur 194 000 lignes de "Remise_Manuelle" manuelle j'ai actuellement 78 enregistrements en double;

Quelle est la meilleure solution :

1 / sachant que je dois faire une jointure entre la table "Detail_commande" et "Magasin" afin d'intégrer le format dans la table "Detail_commande" et intégrer ce champ dans "Intervalmatch"

2 / Lors du chargement de la table "Remise_Manuelle" effectuer un LOAD DISTINCT sur les champs suivant

(Date_Début, Date_Fin, store_id, CDBase_produit)

sfatoux72
Not applicable

Re: Association de deux champs ayant des valeurs différentes et provenant de tables différentes

‌oui, le format doit figurer dans les tables detail_commande et remise_manuelle.

le format doit également être ajouté a l'intervalMatch (2 lignes) et également comme clé de jointure dans l'avant dernier LOAD.