Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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;
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 ?
Pour répondre à votre question, la remise manuelle ne s'applique qu'aux cas sans promo
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;
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.
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;
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.
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)
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.