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 06/05/2011, 16h42   #1
Invité de passage
 
Homme
Consultant BI & CRM
Inscription : mai 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant BI & CRM

Informations forums :
Inscription : mai 2011
Messages : 1
Points : 0
Points : 0
Par défaut Nombre maximum de modalités dans un WHERE ?

Bonjour,

Quelqu'un peut-il me dire quel est le nombre maximum (N) de modalités que l'on peut mettre dans un WHERE variable IN (modalité1, ..., modalitéN) ? S'il y a une limite bien sûr...

Pour information, je travaille sous SAS V9.2 et ma question concerne aussi bien une étape DATA qu'une proc SQL

Merci
ramdanim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 16h54   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Bonjour,
Je ne crois pas qu'il y a des limites. Par contre j'espère pour toi que tu ne vas pas saisir toutes tes valeurs à la main .
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 16h56   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Il y a une limite Sam, mais je ne saurais pas te dire la limite, désolé.
Je te le dirai une fois que j'aurai su
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 11h24   #4
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
bonjour,

l'aide ne donne aucune information quant au nombre max de modalités que l'on peut lister comme argument de la fonction IN... maintenant, un petit test ne mange pas de pain...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
DATA toto;
X=1;
run;
%macro test;
%let listin=1;
%do i=2 %TO 1000;
%let listin=&listin , &i;
DATA test;
SET toto (WHERE=(x IN (&listin)));
run;
 
PROC SQL ;
CREATE TABLE test2 AS
   SELECT *
   FROM toto(WHERE=(x IN (&listin)));
QUIT;
 
%end;
%mend;
 
%test;
1000 modalités en argument de IN et ça fonctionne encore aussi bien en DATA qu'en PROC SQL...

maintenant, plutôt que de lister les arguments, vous pouvez utiliser des intervalles de la manière suivante (depuis SAS 9):

Code :
1
2
 
WHERE x IN (1:1000,1050,2000:20000)
et vous ne retiendrez que les modalités 1 à 1000 , 1050 et 2000 à 20000... ça peut éviter d'écrire l'ensemble des valeurs numériques qui vous intéressent... (si maintenant, vous avez des modalités caractères, les choses sont plus compliquées... 'a':'c' pour 'a', 'b', 'c' n'est pas autorisé.

a+
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 15h11   #5
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Juste une précision par rapport à la suggestion de Sébastien :
l'écriture x IN (100:200) ne prend que les valeurs ENTIERES comprises entre 100 et 200. Si on a éventuellement des valeurs avec des décimales, mieux vaut opter pour X BETWEEN 100 AND 200 -- qui aura aussi le mérite de supporter des conditions sur des variables de type texte.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 15h20   #6
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
ooops.. merci Olivier... (j'aurais dû préciser cela...).

détail amusant - si on exécute ce code :

Code :
1
2
3
4
5
6
7
8
 
DATA toto;
X=1.5;
run;
 
DATA test;
SET toto(WHERE=(x IN(1:2)));
run;
la lecture du journal nous apprend comment les choses fonctionnent réellement :

Code :
1
2
3
 
NOTE:  0 observation(s) lue(s) dans la TABLE WORK.TOTO.
      WHERE (x=INT(x)) AND (x>=1 AND x<=2);
Il faut toujours lire le journal...
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 11h06   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
oui, mais on peut contourner sa avec la fonction INT.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
DATA T1(keep=y);
   x = 2.3;
   do i = 1000 TO 5000;
 
   y=i*x;
      output;
   end;
run;
 
 
proc sql noprint;
 
CREATE TABLE  t2 AS SELECT * FROM t1 WHERE 
 int(Y) IN (2000:3000,5000,6000:7000) ;
quit;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h15.


 
 
 
 
Partenaires

Hébergement Web