Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Application Qlik Sense suivis des clients [Nouveau / Réactivé / Perdu / Loyal]

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

1 Solution

Accepted Solutions
kevinchevrier
Partner - Creator III
Partner - Creator III

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

View solution in original post

9 Replies
kevinchevrier
Partner - Creator III
Partner - Creator III

Bonjour Boris,

Je n'ai pas le temps de détailler mais à mon avis utilise : IF + Count + aggr (par client)

Kevin

Anonymous
Not applicable
Author

Merci pour la piste Kevin, je vais regarder et continuer à bosser sur le sujet en essayant ton idée

kevinchevrier
Partner - Creator III
Partner - Creator III

Exemple :

Client perdu :

=IF(Date(today(),'DD/MM/YYYY')-Date([LastMax_DateCde],'DD/MM/YYYY') > vClientPerdu, 1,0)


Kevin

kevinchevrier
Partner - Creator III
Partner - Creator III

Boris,

Voici la solution pour Client perdu. Fais pareil pour les autres.

Si besoin, reviens vers moi.

Kevin

kevinchevrier
Partner - Creator III
Partner - Creator III

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

kevinchevrier
Partner - Creator III
Partner - Creator III

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

Anonymous
Not applicable
Author

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

kevinchevrier
Partner - Creator III
Partner - Creator III

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

Anonymous
Not applicable
Author

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