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 :

Tableau croisé dynamique, expressions juste ?


Sujet :

QlikView

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut Tableau croisé dynamique, expressions juste ?
    Bonjour à tous,

    J'ai un petit problème lors de la réalisation d'un tableau croisé dynamique.

    Je souhaiterai connaître l'écart type de l'heure d'entrée du premier patient.

    Heure_ES correspond à l'heure d'entrée du patient. Je souhaiterai pouvoir faire un group by Jour, mais je crois que cela n'est pas possible dans la partie expression de mon tableau. Selon vous, cette expression est-elle juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     stdev(aggr(min(heure_ES),Jour))

    Par la suite, disposant de plusieurs années de données, et donc de plusieurs mois, il faudrait qu'il me filtre egalement, par Mois et Années, me suffit-il de rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     stdev(aggr(min(heure_ES),Jour))

    Merci à tous pour vos réponses.

    Cordialement

    CV

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Bon j'ai procédé autrement.
    Je suis allé directement dans le script créer une nouvelle table.

    Cela me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Load
          min(heure_entree_patient) as Var1
    resident Table1 (où j'ai toutes les heures d'entrés)
    Group by date_entree_patient
    Mon problème avec cette méthode, c'est que je veux le minimum par date mais aussi par salles (qui est encore dans une autre table).

    Comment puis-je faire ?
    Visiblement on ne peut pas mettre 2 tables dans "resident", donc je ne peux pas insérer salle directement dans mon group by (que ce serait bien ^^)

    Si quelqu'un a une idée ? Peut être avec un join quelque chose ?

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 419
    Points
    419
    Par défaut
    En effet, il faut réunir les deux tables AVANT de pouvoir faire le group by. Tu peux par exemple faire la réunion dans une table temporaire.

    Pour le minimum par date et par salle, je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    LOAD
    id_salle,
    makedate(year(heure_ES), month(heure_ES), day(heure_ES)) as jour,
    min(heure_ES) as min_heure_ES
    resident Table1
    group by
    id_salle,
    makedate(year(heure_ES), month(heure_ES), day(heure_ES));
    (si "heure_ES" contient la date ET l'heure)
    Car j'imagine que dans Table1, il y a un ID de salle, sans quoi on ne saurait pas dans quelle salle le patient est entré.

    La première expression, là-haut dans ton premier message, me semblait juste mais demande un calcul, à cause d'aggr(), alors qu'une table est calculée à l'avance et est donc a priori plus performante.

    Pour le filtrage par mois et année, ce qu'il te faudrait est sans doute une « dimension temps », autrement dit une table dont la clé est une date et dont les autres champs sont le mois, l'année, le trimestre, etc. Tu peux par exemple construire très simplement cette table à partir de l'autre, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Temps:
    LOAD distinct
    makedate(year(heure_ES), month(heure_ES), day(heure_ES)) as jour,
    year(heure_ES) as annee,
    month(heure_ES) as mois
    resident Table1;
    "jour" sera la clé.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Merci, j'ai réussi à faire le faire marcher :-)

    PAr contre je ne sais pas comment marquer le sujet comme résolu

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Le tag se trouve sous le dernier message de la discussion !



  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Finalement, j'ai un petit soucis

    Je tape ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Table_intermediaire:
    LOAD 
    	@cle_requete,
            makedate(year(ddt_patient_in_room),month(ddt_patient_in_room),
    day(ddt_patient_in_room)) as jour,
    	min(timestamp(ddt_patient_in_room,'hh:mm:ss')) as min_patient
    	resident TempsvsOpe
    	Group by 	makedate(year(ddt_patient_in_room),month(ddt_patient_in_room),day(ddt_patient_in_room));
    tiré d'une table :
    TempsvsOpe:
    LOAD Cle_vsTemps_Operatoires,
    Cle_requete as @cle_requete,
    ddt_patient_in_room,
    timestamp(ddt_patient_in_room,'hh:mm:ss') as heure_ES,
    ddt_patient_outOfRoom-ddt_patient_in_room as heure_Test
    From ...

    Je compte trier mes patients par date, je veux le premier patient de la journée pour chaque jour.

    Le problème c'est que sa m'affiche invalid expression...

    Quelqu'un a une idée ?

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    J'avance j'avance ...

    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
     
    Date_min_pat:
    LOAD DISTINCT
    	makedate(year(ddt_patient_in_room), month(ddt_patient_in_room), day(ddt_patient_in_room)) AS jour_patient,
        Year(ddt_patient_in_room) as year_patient,
        month(ddt_patient_in_room) as month_patient,
        day(ddt_patient_in_room) as day_patient
    resident TempsvsOpe;
     
    Min_pat:
    LOAD 
    	makedate(year(ddt_patient_in_room),month(ddt_patient_in_room),day(ddt_patient_in_room)) as jour_patient,
    	min(timestamp(ddt_patient_in_room,'hh:mm:ss')) as min_patient
    	resident TempsvsOpe
    	Group by 
    	makedate(year(ddt_patient_in_room),month(ddt_patient_in_room),day(ddt_patient_in_room));
    Voilà les 2 tables que j'ai crée comme indiqué plus haut.
    Le problème, c'est que je dispose de plusieurs salles et je souhaiterai connaitre le minimum par jour de chaque salle dans mon tableau final. Or avec ce script, il me donne le minimum par jour de toutes les salles confondues.

    Mes salles se trouvent dans une autre table. Mes 2 tables que j'ai à la base sont reliés dans une 3ème table. Ma table ou j'ai mes dates et heure d'entrés des patient a une clé différente que ma table Salle. Ces 2 clés sont donc présente dans la 3ème table qui permet la liaison entre mes tables.

    Comment faire ?

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 419
    Points
    419
    Par défaut
    Il n'y a pas besoin de calculer le minimum dans le script. Le tableau pivot (nom officiel du "tableau croisé dynamique" dans QlikView) va s'en charger.
    Vous n'avez donc besoin que de vos tables patient, salle et requete actuelles.
    Mais dans la table comportant l'heure, c'est-à-dire patient, vous devez séparer la date et l'heure puisque l'une sera une dimension du tableau pivot et l'autre, une expression.
    Pour ce faire, vous devez intercaler une instruction LOAD entre le nom de la table et l'instruction de chargement.
    Le résultat aura cette allure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Patients:
    LOAD
    cle_requete,
    cle_temp_op,
    ddt_patient_in_room,
    makedate(year(ddt_patient_in_room), month(ddt_patient_in_room), day(ddt_patient_in_room)) as jour_patient,
    maketime(hour(ddt_patient_in_room), minute(ddt_patient_in_room)) as heure_patient
    ;
    SQL SELECT cle_requete, cle_temp_op, ddt_patient_in_room from patients;
    Après quoi, vous mettez salle et jour_patient en dimensions du tableau pivot, les expressions étant :
    Et
    Et voilà !

    Concernant votre message #6, le problème est qu'il faut répéter dans la clause group by tous les champs qui ne sont pas des agrégations (en l'occurence il manquait @cle_requete).

    Concernant votre message #7 : attention, la fonction timestamp() change uniquement la représentation chaîne du dual, pas sa valeur numérique. Autrement dit retirer la date dans le format ne la retire pas réellement ; elle reste mais est invisible. Pour être sûr de retirer la date il faut utiliser maketime(), et pour être sûr de retirer les heures, makedate().
    Même remarque d'ailleurs avec la fonction date(), qui modifie uniquement la représentation chaîne.

    Je cite l'aide en ligne : « The timestamp function formats the expression as a date and time according to the string given as format-code. » (je souligne). Seule la représentation chaîne est modifiée.

    Petite remarque enfin sur votre schéma : votre table "patient" me semble plutôt contenir des visites, puisqu'on y trouve une date et une heure d'entrée. La table "patient" serait plutôt une autre table.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Salut,

    Merci pour ta réponse.

    Une petite chose que je ne comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Patients:
    LOAD
    cle_requete,
    cle_temp_op,
    ddt_patient_in_room,
    makedate(year(ddt_patient_in_room), month(ddt_patient_in_room), day(ddt_patient_in_room)) AS jour_patient,
    maketime(hour(ddt_patient_in_room), minute(ddt_patient_in_room)) AS heure_patient
    ;
    SQL SELECT cle_requete, cle_temp_op, ddt_patient_in_room FROM patients;
    Que signifie la dernière ligne de code ? C'est pour créer une nouvelle table ?

    Sinon, ce que tu m'as donné marche parfaitement pour connaitre le minimum par jour ou sur une période. Le problème c'est si je souhaite calculer la moyenne des minimum ça ne fonctionnera pas. Qlikview me fera la moyenne sur toutes la table... Or je veux qu'il me fasse la moyenne des tous les minimums des journées sur ma période et pour ma salle.

    Merci pour les réponses à mes messages précédent, mais mon code ne marchera pas puisque je n'arrive pas à relier la table salle.

    Pour finir, ma table patient concerne enfaite des opérations, donc entré en salle opératoire, sortie salle opératoire avec d'autre info mais pas importante pour ce que je souhaite faire dans ce cas ^^

    Cordialement

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 419
    Points
    419
    Par défaut
    La dernière ligne doit être remplacée par le code qui charge ta table actuellement.

    Il y a donc plusieurs résultats à afficher. Pour la moyenne, essaye l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avg(aggr(min(heure_patient), salle, jour_patient))
    Si tu fais en sorte que la salle soit la première dimension du tableau pivot et le jour, la deuxième, et qu'un sous-total soit affiché après chaque salle (onglet « Presentation », option « Show Partial Sums »), tu devrais voir ta moyenne. Sur les lignes de détail elle répétera le minimum, mais ce n'est pas grave.

    Une autre solution est de pré-calculer par script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Min_Heure:
    LOAD salle, jour_patient, min(heure_patient) as min_heure_patient
    resident patient
    group by salle, jour_patient;
    En quel cas ton expression devient simplement :
    Il faut aussi une ligne de total.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par yvesduc Voir le message
    La dernière ligne doit être remplacée par le code qui charge ta table actuellement.

    Il y a donc plusieurs résultats à afficher. Pour la moyenne, essaye l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avg(aggr(min(heure_patient), salle, jour_patient))
    Si tu fais en sorte que la salle soit la première dimension du tableau pivot et le jour, la deuxième, et qu'un sous-total soit affiché après chaque salle (onglet « Presentation », option « Show Partial Sums »), tu devrais voir ta moyenne. Sur les lignes de détail elle répétera le minimum, mais ce n'est pas grave.

    Une autre solution est de pré-calculer par script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Min_Heure:
    LOAD salle, jour_patient, min(heure_patient) as min_heure_patient
    resident patient
    group by salle, jour_patient;
    En quel cas ton expression devient simplement :
    Il faut aussi une ligne de total.
    Je te remercie, j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avg(aggr(min(heure_patient), salle, jour_patient))
    avec les sommes partielles c'est exactement ce que je voulais.

    Très bonne fin de journée :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2015, 09h55
  2. filtrer tableau croisé dynamique sous excel
    Par kernel57 dans le forum Excel
    Réponses: 7
    Dernier message: 17/11/2006, 14h18
  3. Tableau croisé dynamique
    Par papy_tergnier dans le forum Access
    Réponses: 5
    Dernier message: 26/12/2005, 18h05
  4. tableau Croisé Dynamique
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/11/2005, 10h36
  5. tableau croisé dynamique sous delphi, comment ?
    Par Brice Yao dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2005, 09h33

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