Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
Je dois réaliser une application qui mesure la volumétrie de nouveaux clients / clients réactivés / clients perdus / clients loyaux, par semaines, mois, années
J'ai regardé pas mal de tuto ou de discussions sur le sujet mais aucune ne répond vraiment à mes besoins.
Voici les différents critères pour chaque typologies de clients.
- Nouveaux Clients, [Flag nouveau client, lors de sa première commande],
j'ai pus résoudre ce point en récupérant la date de première commande dans une table à part, et avec un apply map j'applique le flag sur la date de première commande du client.
- Clients Réactivés, [Flag client réact, lors du passage d'une commande après un an sans avoir passé de commande]
J'arrive à faire se flag, mais uniquement sur les dernières commandes avec un Max(Timestamp) & Max(Timestamp,2); mais cela écrase un potentiel ancien flag réact
- Client Perdus [Flag client perdus, si aucune commande depuis 3 mois]
- Client Loyaux [Flag client loyal, si 1 commande par mois depuis 3 mois]
J'ai deux tables une qui provient de ma BDD et la deuxième créé pour le flag nouveau client et client réact, à date mais ne convient pas parfaitement à mon besoin
[ORDER]:
- Order_Number
- Customer
- Date_Commande
[Customer_id_MinMaxLastDate]:
Load
Customer,
Min(Date_Commande) AS [Min_DateCde],
Max(Date_Commande,2) AS [LastMax_DateCde],
Max(Date_Commande) AS [Max_DateCde]
Resident [ORDER_T]
Group By Customer
;
Ne pouvant vous joindre ma table Order, vous trouverez ci-joint une table à charger pour faire vos test
[ORDER]:
LOAD * INLINE [
Order_Number, Customer, Date_Commande
1,AAA,01/08/2011 => Nouveau Client
2,BBB,05/08/2011 => Nouveau Client
3,CCC,07/08/2011 => Nouveau Client
4,DDD,09/08/2011 => Nouveau Client
5,EEE,15/08/2011 => Nouveau Client
6,BBB,05/09/2011
7,CCC,07/09/2011
8,DDD,09/09/2011
9,BBB,05/10/2011 => Client Loyal
=> Client Perdu (AAA à la date du 01/11/2011) car pas de commande depuis 3 mois
10,CCC,07/11/2011
11,DDD,09/11/2011
....
25,AAA,01/12/2012 => Client Réactivé
...
=> Client Perdu (AAA à la date du 01/03/2013) car pas de commande depuis 3 mois
40,AAA,01/03/2015 => Client Réactivé
Il n'est pas impossible que les variables définissant le type de client changent, pour cela il serait appréciable d'avoir des variables de ce type :
vClientReact = vient de passer une commande mais dernière commande date de plus de 365 jours
vClientPerdu = 90 jours sans commande
vClientLoyal = 1 commande sur 30 jours 3 fois de suite
D'avance merci pour vos réponses
Je me tiens à votre disposition si besoin
Boris,
Désolé je ne peux pas car je n'ai pas QLIKSENSE.
Voici le script :
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 €;-# ##0,00 €';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='fr-FR';
SET MonthNames='janv.;févr.;mars;avr.;mai;juin;juil.;août;sept.;oct.;nov.;déc.';
SET LongMonthNames='janvier;février;mars;avril;mai;juin;juillet;août;septembre;octobre;novembre;décembre';
SET DayNames='lun.;mar.;mer.;jeu.;ven.;sam.;dim.';
SET LongDayNames='lundi;mardi;mercredi;jeudi;vendredi;samedi;dimanche';
SET vClientPerdu = 90;
SET vClientReact = 365;
SET vClientLoyal = 31;
[ORDER_T]:
LOAD * INLINE [
Order_Number, Customer, Date_Commande
1,AAA,01/08/2011
2,BBB,05/08/2011
3,CCC,07/08/2011
4,DDD,09/08/2011
5,EEE,15/08/2011
6,BBB,05/09/2011
7,CCC,07/09/2011
8,DDD,09/09/2011
9,BBB,05/10/2011
10,CCC,07/11/2011
11,DDD,09/11/2011
25,AAA,01/12/2012
40,AAA,01/03/2015];
[ORDER]:
LOAD *,
'A' as temp
RESIDENT [ORDER_T]
order by Customer, Date_Commande;
Drop table [ORDER_T];
TABLE :
Load Customer,
Date_Commande,
IF(Previous(Customer)=Customer,0,1) as NOUVEAU_CLIENT,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientPerdu), 1,0),0) as CLIENT_PERDU,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientReact), 1,0),0) as CLIENT_REACT,
If(Customer=Peek(Customer,-2) AND Date_Commande - Peek(Date_Commande) <= $(vClientLoyal) AND Peek(Date_Commande) - Peek(Date_Commande,-2) <= $(vClientLoyal) ,1,0) as CLIENT_LOYAL
RESIDENT [ORDER];
DROP Table [ORDER];
Kevin
Bonjour Boris,
Je n'ai pas le temps de détailler mais à mon avis utilise : IF + Count + aggr (par client)
Kevin
Merci pour la piste Kevin, je vais regarder et continuer à bosser sur le sujet en essayant ton idée
Exemple :
Client perdu :
=IF(Date(today(),'DD/MM/YYYY')-Date([LastMax_DateCde],'DD/MM/YYYY') > vClientPerdu, 1,0)
Kevin
Boris,
Voici la solution pour Client perdu. Fais pareil pour les autres.
Si besoin, reviens vers moi.
Kevin
Pour compléter :
IF(Previous(Customer)=Customer,0,1) as NOUVEAU_CLIENT,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientPerdu), 1,0),0) as CLIENT_PERDU,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientReact), 1,0),0) as CLIENT_REACT
J'essaie de te trouver une solution pour les clients loyaux.
Kevin
Boris,
Voici l'application finale avec le 4 flags :
IF(Previous(Customer)=Customer,0,1) as NOUVEAU_CLIENT,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientPerdu), 1,0),0) as CLIENT_PERDU,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientReact), 1,0),0) as CLIENT_REACT,
If(Customer=Peek(Customer,-2) AND Date_Commande - Peek(Date_Commande) <= $(vClientLoyal) AND Peek(Date_Commande) - Peek(Date_Commande,-2) <= $(vClientLoyal) ,1,0) as CLIENT_LOYAL
En espérant que cela réponde à ta demande.
Kevin
Merci beaucoup Kevin, je te fais un retour dans la journée
EDIT : Par contre si tu as la possibilité d'envoyé l'appli via un qvf ça m'arrangerais
Boris,
Désolé je ne peux pas car je n'ai pas QLIKSENSE.
Voici le script :
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 €;-# ##0,00 €';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='fr-FR';
SET MonthNames='janv.;févr.;mars;avr.;mai;juin;juil.;août;sept.;oct.;nov.;déc.';
SET LongMonthNames='janvier;février;mars;avril;mai;juin;juillet;août;septembre;octobre;novembre;décembre';
SET DayNames='lun.;mar.;mer.;jeu.;ven.;sam.;dim.';
SET LongDayNames='lundi;mardi;mercredi;jeudi;vendredi;samedi;dimanche';
SET vClientPerdu = 90;
SET vClientReact = 365;
SET vClientLoyal = 31;
[ORDER_T]:
LOAD * INLINE [
Order_Number, Customer, Date_Commande
1,AAA,01/08/2011
2,BBB,05/08/2011
3,CCC,07/08/2011
4,DDD,09/08/2011
5,EEE,15/08/2011
6,BBB,05/09/2011
7,CCC,07/09/2011
8,DDD,09/09/2011
9,BBB,05/10/2011
10,CCC,07/11/2011
11,DDD,09/11/2011
25,AAA,01/12/2012
40,AAA,01/03/2015];
[ORDER]:
LOAD *,
'A' as temp
RESIDENT [ORDER_T]
order by Customer, Date_Commande;
Drop table [ORDER_T];
TABLE :
Load Customer,
Date_Commande,
IF(Previous(Customer)=Customer,0,1) as NOUVEAU_CLIENT,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientPerdu), 1,0),0) as CLIENT_PERDU,
IF(Previous(Customer)=Customer, If(Date(Date_Commande,'DD/MM/YYYY')-Previous(Date(Date_Commande,'DD/MM/YYYY')) > $(vClientReact), 1,0),0) as CLIENT_REACT,
If(Customer=Peek(Customer,-2) AND Date_Commande - Peek(Date_Commande) <= $(vClientLoyal) AND Peek(Date_Commande) - Peek(Date_Commande,-2) <= $(vClientLoyal) ,1,0) as CLIENT_LOYAL
RESIDENT [ORDER];
DROP Table [ORDER];
Kevin
Re bonjour Kevin,
J'ai correctement intégré ton code, à première vus cela fonctionne parfaitement.
Je dois passer par la phase de vérification des données, mais à première vus cela semble impeccable.
Encore une fois merci