Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2011, 19h29   #1
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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 :
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
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 01h10   #2
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
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 :
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 :
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 :
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 :
1
2
3
4
5
6
 
PROC SQL;
CREATE TABLE TableClientOui
AS SELECT DISTINCT IdClient
FROM TableClient
WHERE Question='OUI';quit;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 07h59   #3
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 08h26   #4
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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 ...
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 09h39   #5
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 145
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 145
Points : 1 763
Points : 1 763
Un client peut avoir repondu oui ET non(c'est le cas de ton client 2 dans ton exemple).

Citation:
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

Citation:
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 :
1
2
3
DATA OUI(keep=IdClient );
SET ;SET TableClient(WHERE=(Question='OUI'));
run;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 12h47   #6
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Bonjour

Citation:
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 :
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;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h17   #7
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 00h13   #8
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
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 :
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;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 10h16   #9
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
j'ai mis :

Code :
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...
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h16.


 
 
 
 
Partenaires

Hébergement Web