IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

QlikView Discussion :

Compter la Qté de valeurs Minimum d'un jeu de données


Sujet :

QlikView

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Compter la Qté de valeurs Minimum d'un jeu de données
    Bonjour,

    voilà un jeu de données extrêmement simplifié, pour l'exemple,

    JOUR AGE
    01/03/2022 1
    01/03/2022 1
    01/03/2022 1
    02/03/2022 2
    02/03/2022 2
    02/03/2022 9
    03/03/2022 3
    03/03/2022 3
    03/03/2022 8
    04/03/2022 4
    04/03/2022 4
    04/03/2022 7
    05/03/2022 5
    05/03/2022 5
    05/03/2022 6
    06/03/2022 6
    06/03/2022 6
    06/03/2022 5
    07/03/2022 7
    07/03/2022 7
    07/03/2022 4
    08/03/2022 8
    08/03/2022 8
    08/03/2022 3
    09/03/2022 9
    09/03/2022 9
    09/03/2022 2
    10/03/2022 10
    10/03/2022 10

    Pour chaque jour je veux obtenir un tableau contenant, l'age minimum , l'age maximum, Nbre de fois de l'age minimun par jour, et aussi de l'age maxi.


    Résultat voulu:

    JOUR MIN_AGE MAX_AGE Qté Age Min Qté Age Max
    01/03/2022 1 1 3 3
    02/03/2022 2 9 2 1
    03/03/2022 3 8 2 1
    04/03/2022 4 7 2 1
    05/03/2022 5 6 2 1
    06/03/2022 5 6 1 2
    07/03/2022 4 7 1 2
    08/03/2022 3 8 1 2
    09/03/2022 2 9 1 2
    10/03/2022 10 10 2 2

    Bien sûr, je n'ai aucun problème pour les Min et Max.

    Mais je ne comprends pas comment formuler => Faire le Compte de Valeur MIN_AGE par JOUR

    J'espère que je suis clair.

    merci d'avance pour toute piste possible.

    Stéphane

  2. #2
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a plusieurs façons de répondre à cette question.

    Dans tous les cas, le mieux est de charger les données en s'arrangeant pour que chaque ligne ait un identifiant unique.

    Nous allons donc charger les données de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    data:
    LOAD *,
    RecNo() AS ID;
    LOAD * INLINE [
    JOUR, AGE
    01/03/2022, 1
    01/03/2022, 1
    01/03/2022, 1
    02/03/2022, 2
    02/03/2022, 2
    02/03/2022, 9
    03/03/2022, 3
    03/03/2022, 3
    03/03/2022, 8
    04/03/2022, 4
    04/03/2022, 4
    04/03/2022, 7
    05/03/2022, 5
    05/03/2022, 5
    05/03/2022, 6
    06/03/2022, 6
    06/03/2022, 6
    06/03/2022, 5
    07/03/2022, 7
    07/03/2022, 7
    07/03/2022, 4
    08/03/2022, 8
    08/03/2022, 8
    08/03/2022, 3
    09/03/2022, 9
    09/03/2022, 9
    09/03/2022, 2
    10/03/2022, 10
    10/03/2022, 10
    ];
    Ensuite, on fait un graphique de type "tableau simple" avec comme dimension "JOUR" et comme première expression "=min(AGE)".


    En utilisant la fonction "aggr"
    Cette méthode consiste à se construire un tableau intermédiaire "en mémoire" et de travailler dessus pour faire une condition.
    Pour cela on utilise la fonction "aggr(expression, dimension1, dimension2, ...)".

    La formule finale qui répond à la question est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(aggr(if(AGE = min(TOTAL <JOUR> AGE), 1, 0), JOUR, ID))
    Elle se lit de la manière suivante :
    - Je fais un tableau en mémoire (fonction "aggr") qui a comme dimensions JOUR et ID.
    - Pour chacun de ces couples, je trouve l'age minimum du JOUR en question ("min(TOTAL <JOUR> AGE)"). Où "TOTAL <JOUR>" veut dire "je ne fais l'agrégation qu'en prenant en compte la dimension "JOUR".
    - Toujours pour chacun de ces couples, je regarde si l'AGE est égal à cette valeur. Si c'est le cas je mets 1, sinon 0)
    Je me retrouve donc avec un tableau imaginaire qui a comme dimension "JOUR" et "ID" et comme valeur "1" ou "0" en fonction de ma condition.
    - Sur ce tableau en mémoire, je fais la somme.

    J'obtiens donc pour chaque JOUR, le nombre d'ID pour lesquels l'AGE est égal au min(AGE) du JOUR.

    Avantages :
    - On a juste 1 expression à utiliser.
    - On peut la rendre dynamique en fonction de sélections.

    Inconvénients :
    - S'il y a beaucoup de données, ça peut prendre beaucoup de place en mémoire.
    - Pas forcément simple à comprendre quand on n'est pas habitué.



    En précalculant les min / max au chargement
    Une autre solution consiste à précalculer les informations dès le chargement.
    On va rajouter dans notre script de chargement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LEFT JOIN (data)
    LOAD JOUR,
    min(AGE) AS MIN_AGE,
    max(AGE) AS MAX_AGE
    RESIDENT data
    GROUP BY JOUR;
    qui va rajouter à notre table 2 colonnes contenant respectivement la valeur min et la valeur max du jour.

    Dans notre graphique, on pourra utiliser une fonction facile à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(if(AGE = MIN_AGE, ID))
    Avantages :
    - Facile à comprendre.

    Inconvénients :
    - S'il y a beaucoup de données, ça peut prendre quand même un peu de place en mémoire.
    - La formule ne sera pas dynamique. Par exemple si on avait un autre champ "SEXE", on ne pourrait pas filtrer sur "SEXE=homme" et avoir la valeur exacte car les min/max sont calculés par JOUR.



    Pareil, mais en rajoutant un flag qui sera plus facile à filtrer
    Au lieu de calculer notre condition "AGE = MIN_AGE" dans notre expression, on peut aussi le précalculer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LEFT JOIN (data)
    LOAD ID,
    if(AGE = MIN_AGE, 1, 0) AS IS_MIN,
    if(AGE = MAX_AGE, 1, 0) AS IS_MAX
    RESIDENT data;
    Toutes les lignes ayant le champ "IS_MIN" à "1" seront les lignes dont l'age correspond au minimum du jour.
    On peut donc utiliser un Set Analysis pour effectuer notre filtre dans l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count({$ <IS_MIN={1}>} ID)
    L'avantage par rapport à la solution précédente, c'est que s'il y a beaucoup de données, le filtre sera hyper rapide.



    Je sais qu'il existe une 4em solution qui consiste à utiliser une expression agrégée directement dans le Set Analysis, mais je suis trop rouillé en QlikView pour retrouver la bonne syntaxe, désolé...
    (ça fait plus de 2 ans que je n'en fais plus professionnellement)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    merci beaucoup pour toutes ces pistes.

    Le précalcul au chargement j'y ai pensé, mais avec mon jeu de données réel c'est un peu compliqué.

    - Je vais tester l'aggr avec identifiant unique, j'avais identifié la fonction, mais j'ai un peu de mal à comprendre son utilisation.

    ça fait également 3 ans que je n'ai plus pratiqué QLIKVIEW, et je n'ai jamais utilisé cette fonction, alors un peu dur dur...

Discussions similaires

  1. Valeur minimum dans un TChart
    Par looping dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/10/2007, 21h58
  2. [TCD]Compter le nombre de valeurs distinctes
    Par xaramelaz dans le forum Excel
    Réponses: 2
    Dernier message: 16/08/2007, 20h37
  3. Compter le nombre de valeur en rouge
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/05/2007, 14h18
  4. Compter le nombre de valeurs différentes
    Par solorac dans le forum Excel
    Réponses: 6
    Dernier message: 21/04/2007, 16h13
  5. [Excel] Compter le nombre de valeurs
    Par Malach dans le forum Excel
    Réponses: 3
    Dernier message: 06/04/2006, 00h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo