Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Effectuer un calcul entre 2 champs en fonction des valeurs d'un autre champ

Bonjour,

Je possède un jeu de donnée dans lequel je dispose de plusieurs activités.

Ces activités possèdent plusieurs statuts d'activité (activité planifiée, activité commencée, activité terminée, activité facturée, etc.) associés à une date et une heure (format horodateur).

J'aimerai, avec le logiciel Qlik Sense, déterminer le temps qui s'est déroulé entre le statut "activité commencée" et le statut "activité terminée" sans prendre en compte les autres statuts qui ne m'intéressent pas.

Pouvez-vous m'aider s'il vous plait ?

PS : Je ne sais pas si ma question est très claire donc demandez plus de précisions si besoin.

1 Solution

Accepted Solutions
fredericmante
Partner - Contributor III
Partner - Contributor III

Bonjour,

voici une solution

===========================

data:

LOAD ctivity_id,

     statut,

     date_time_statut

FROM

[test.txt]

(txt, codepage is 1252, embedded labels, delimiter is ';', msq);

donnée:

load *, if( not isnull(date_time_statut_deb),date_time_statut - date_time_statut_deb) as délai;

load ctivity_id,

     statut,

     if ( ctivity_id <> peek(ctivity_id), 1,0) as flagdebut,

     if ( ctivity_id = peek(ctivity_id) and statut <> 'activité commencée', peek(date_time_statut)) as date_time_statut_deb,

     date_time_statut

     resident data where statut <> 'activité confirmé' and statut <> 'activité programmé'

order by ctivity_id, date_time_statut asc;

drop table data;

==================================

A+

View solution in original post

6 Replies
flochi75
Creator III
Creator III

bonjour Jérôme,

pour ma part, je ferai dans le script (si c'est dans la même table) :

load*,

if(activité='[activité commencée]',TonChampDateHeure)-if(activité='[activité terminée]',TonChampDateHeure) as DélaiTTT;

load Matable

from...

Florent

flochi75
Creator III
Creator III

si non, je pense que tu peux le faire aussi dans l'expression.

Not applicable
Author

J'essaye d'écrire la première formule et elle ne se compile pas mais il n'y a pas non plus de message d'erreur.

Que voulez-vous dire par '"dans l'expression" ?

Not applicable
Author

Je vais tenter de mieux expliquer mon cas.
J'avais également oublié qu'il y avait un statut "pause" lorsque l'activité ne s'est pas fait d'une traite.
Par exemple je peux avoir pour une activité des données présentées ainsi :

activity_id     |   statut     |  date_time_statut

activity_1      | activité programmé   |   14/07/2016 10:00:00

activity_1      | activité confirmé       |   14/07/2016 15:00:00

activity_1      | activité commencée  |   20/07/2016 11:00:00

activity_1      | pause                      |   20/07/2016 13:00:00

activity_1      |activité commencée   |   20/07/2016 14:00:00

activity_1      |pause                        |   20/07/2016 17:30:00

activity_1      |activité commencée   |    21/07/2016 09:30:00

activity_1      |activité terminée        |     21/07/2016 10:29:00

Il se peut également que l'activité ce soit terminée un première fois mais qu'une seconde intervention soit finalement programmée pour une quelconque raison et que cela nous rajoute :

activity_1      | activité commencée  | 22/07/2016 08:00:00

activity_1      | activité terminée       | 22/07/2016 09:30

Du coup j'aimerai que pour cette activity_1 Qlik Sense me renvoi une durée d'activité de 6:29 si le premier cas est avéré ou 7:59 dans le cas où la deuxième intervention venait à se rajouter.

J'espère que l'exemple rend la question plus claire

fredericmante
Partner - Contributor III
Partner - Contributor III

Bonjour,

voici une solution

===========================

data:

LOAD ctivity_id,

     statut,

     date_time_statut

FROM

[test.txt]

(txt, codepage is 1252, embedded labels, delimiter is ';', msq);

donnée:

load *, if( not isnull(date_time_statut_deb),date_time_statut - date_time_statut_deb) as délai;

load ctivity_id,

     statut,

     if ( ctivity_id <> peek(ctivity_id), 1,0) as flagdebut,

     if ( ctivity_id = peek(ctivity_id) and statut <> 'activité commencée', peek(date_time_statut)) as date_time_statut_deb,

     date_time_statut

     resident data where statut <> 'activité confirmé' and statut <> 'activité programmé'

order by ctivity_id, date_time_statut asc;

drop table data;

==================================

A+

Not applicable
Author

Merci pour cette réponse,

J'ai légèrement modifié votre code pour obtenir ce qu'il me fallait.

Si ça intéresse quelqu'un, j'ai procédé ainsi :

Délai:

load activity_id,

     date_time_status,

     status_id,

     Statut,

     if ( activity_id = peek(activity_id),if(status_id <> 60, Time(date_time_status-peek(date_time_status)),'00:00'),'00:00') as délai

     resident ActivityStatus where (status_id = 60 or (status_id=68 or (status_id=70)))

order by activity_id, date_time_status;

Load activity_id, Time(sum(délai)) as délai_total resident Délai Group By activity_id;