Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
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

1 Solution

Accepted Solutions
sfatoux72
Partner - Specialist
Partner - Specialist

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;

View solution in original post

8 Replies
sfatoux72
Partner - Specialist
Partner - Specialist

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 ?

Anonymous
Not applicable
Author

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

sfatoux72
Partner - Specialist
Partner - Specialist

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;

Anonymous
Not applicable
Author

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.

Anonymous
Not applicable
Author

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

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.

Anonymous
Not applicable
Author

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

‌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.