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

SAS Base Discussion :

Lister les observations selon un critère [DATA]


Sujet :

SAS Base

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut Lister les observations selon un critère
    Bonjour,

    j'ai une table qui contient un numéro de client (idclient) un identifiant de visite (idvis) et une question (question).
    Je veux avoir le numéro des clients qui réponde oui à question (peut importe la visite).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    idclient  |  idvis   |   question  |
    --------------------------------------
    1          |     1    |         NON 
    --------------------------------------
    1          |     2     |        NON  
    --------------------------------------
    2          |    1      |        NON  
    --------------------------------------
    2          |     2     |        OUI
    --------------------------------------
    2          |     3     |        NON 
    --------------------------------------
    on m'a conseillé d'utiliser la fonction LAST mais je ne vois pas du comment comment faire. En gros, il faudrait boucler les clients, et dès qu'un a OUI à la question s’arrêter de lister et passer au client suivant....

    des idées ?
    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonsoir,

    que cherche tu exactement à faire ?

    Si tu veux seulement la liste des ID des clients qui répondent à la question par "oui" ou si tu veux faire quelque chose de plus compliqué (garder les lignes des clients qui répondent à la question par "oui" par exemple).


    Si tu veux seulement les numéro des clients qui répondent "oui" à la question je te propose plusieurs façon


    Par l'utilisation de last.(var)

    Alors effectivement tu peux utiliser last pour faire cette liste.
    La table d'originie nécessite cependant d'être triée selon un certain ordre, si ce n'est pas fait faut le faire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Proc sort data = TableClient ; by IdClient  Question;run;
     
    data TableClientOui; set TableClient;
    by IdClient Question;
    if last.Question='OUI';
    keep IdClient;
    run;
    Une autre alternative avec last ou first si ta table de départ est déjà triée par numero de client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Data TableClientOui; set ClientOui(where=(Question='OUI'));
    by IdClient;
    if first.IdClient;
    keep IdClient;
    run;
    Dans le code précédent tu peux remplacer aussi First par Last et ça marchera de la même façon.






    Tu peux aussi faire une sélection directe avec une suppression des doublons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Data TableClientOui;set TableClient;
    if Question='OUI';
    keep IdClient;run;
     
    Proc sort data=TableClientOui nodupkey; by IdClient;run;

    Tu dois aussi pouvoir utiliser une simple SQL avc une syntaxe à peu près celle là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROC SQL;
    create Table TableClientOui
    as select distinct IdClient
    from TableClient
    where Question='OUI';quit;

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Bonjour,

    merci pour ta réponse, mais une chose me turlupine... first va prendre la première observation et last la dernière... donc si pour un client j'ai 5 ligne, je ne vais regarder que la 1ere et la dernière ligne ?...
    Merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    En fait ce que je veux faire c'est lister ma table pour savoir si le client a oui ou non à la question. dès qu'il a un oui je m'arrete de lister.
    voilà, mais là je ne sais pas comment faire pour boucler dans SAS ...

  5. #5
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Un client peut avoir repondu oui ET non(c'est le cas de ton client 2 dans ton exemple).

    En fait ce que je veux faire c'est lister ma table pour savoir si le client a oui ou non à la question
    n'est pas la meme chose que

    Je veux avoir le numéro des clients qui réponde oui à question (peut importe la visite).
    Je prends pour hypothese que tu veux retenir une liste de client corespondant a ceux qui ont repondu au moins un fois "oui"(si ce n'est pas le cas, merci de preciser plus en details ce que tu veux!!).

    Jerome a deja propose des solutions, les as tu essayees? Apres cela depend egalement de ce que tu veux faire de cette liste. Il peut y avoir des approches plus ou moins appropriees (ce qui ne veux pas dire que les moins appropriees ne sont pas bonnes).

    En voici un autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data OUI(keep=IdClient );
    set ;SET TableClient(where=(Question='OUI'));
    run;

  6. #6
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour

    En fait ce que je veux faire c'est lister ma table pour savoir si le client a oui ou non à la question
    Effectivement comme le note Manoutz ce n'est pas la même chose...

    Alors tu as effectivement une solution avec RETAIN + LAST par exemple

    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
     
    data TableClient;
    IdClient='1';question='NON';output;
    IdClient='1';question='NON';output;
    IdClient='2';question='NON';output;
    IdClient='2';question='OUI';output;
    IdClient='2';question='NON';output;
    proc sort data=TableClient; by IdClient;run;
     
    data ReponseClient;
    set TableClient;
    by  IdClient;
    retain I_question 'NON';
    if Question='OUI' then I_Question='OUI';
    if last.IdClient then output;
    keep IdClient I_Question;
    run;

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    merci à vous deux.

    effectivement ce n'est pas la meme chose.. vendredi je pensais qu'il me fallait ceux qui ont répondu oui..
    J'ai opté pour la dernière solution qui fonctionne.
    merci beaucoup

  8. #8
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Citation Envoyé par maysa Voir le message
    merci à vous deux.

    effectivement ce n'est pas la meme chose.. vendredi je pensais qu'il me fallait ceux qui ont répondu oui..
    J'ai opté pour la dernière solution qui fonctionne.
    merci beaucoup
    Bonsoir,

    je pense néanmoins qu'une petite erreur d'initialisation s'est glissé dans le code que je t'ai proposé...

    Il doit falloir effectivement une condition d'initialisation du type

    IF First.IdClient then I_Question='NON';

    le code complet devenant

    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
     
    DATA TableClient;
    IdClient='1';question='NON';output;
    IdClient='1';question='NON';output;
    IdClient='2';question='NON';output;
    IdClient='2';question='OUI';output;
    IdClient='2';question='NON';output;
    proc sort DATA=TableClient; BY IdClient;run;
     
    DATA ReponseClient;
    SET TableClient;
    BY  IdClient;
    retain I_question 'NON';
    IF first.IdClient then I_Question='NON';
    IF Question='OUI' then I_Question='OUI';
    IF last.IdClient then output;
    keep IdClient I_Question;
    run;

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    retain I_question;
    IF first.idclientTHEN I_question="non";
     
    IF question="oui" THEN I_question="oui";
    IF last.idclient THEN DO;
    				lastvis=idvis;
    				datelastvis = visd;
    				END;
    ça fonctionne...

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

Discussions similaires

  1. [XL-2003] lister les infos selon une date
    Par chryssouille dans le forum Excel
    Réponses: 3
    Dernier message: 09/09/2011, 11h20
  2. Comment colorier les cellules selon un critère,
    Par abouilyas dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 06/07/2011, 06h34
  3. [Batch] Récupérer tous les fichiers selon certains critères
    Par Mistic100 dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 27/07/2009, 01h20
  4. Lister les titres selon le style (Titre 1, Titre 2, ...)
    Par ouskel'n'or dans le forum VBA Word
    Réponses: 6
    Dernier message: 25/07/2009, 10h17
  5. lister des fichiers selon des critères
    Par Corben dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 18/10/2005, 16h52

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