Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
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 25/03/2011, 11h04   #1
Invité de passage
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : mars 2011
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : mars 2011
Messages : 23
Points : 3
Points : 3
Par défaut Restreindre à 20 le résultat de proc tabulate

Bonjour à tous,
Je suis débutant en SAS.
J'ai effectué une proc tabulate pour obtenir la fréquence de chaque valeurs d'une variable. Cela fonctionne mais je voudrais savoir si il était possible d'obtenir que les 20 premiers enregistrement du résultat.
VOici mon code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 TITLE;
	TITLE1 &myTitle1;
	FOOTNOTE;
 
	PROC TABULATE
	DATA=&tablesource
	OUT=WORK.STAB&myTitle1(LABEL="Summary Tables  for CDM_BER.VW_BPACCHIERARCHY")
	;
	CLASS COMPANYCODE /	ORDER=UNFORMATTED MISSING;
	CLASS &myTitle1 /	ORDER=FREQ;
	TABLE 
		COMPANYCODE *&myTitle1 ,
		 N = "Fréquence" ;
	;
En vous remerciant.
walooze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 11h26   #2
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
Salut.
On pourrait bien insérer directement un WHERE au niveau de l'option OUT, qui ne garderait que les 20 premières lignes : (WHERE=(MONOTONIC()<=20)) mais ce qui me chagrine, c'est que la table en sortie n'est pas réellement triée -- en tout cas d'une manière générale.
Je m'explique : imaginons que tu fasses un tableau AGE * SEXE. En mettant des ORDER=FREQ dans les instructions CLASS de AGE et SEXE, tu demandes bien à SAS de présenter le tableau par effectifs décroissants. Mais il est obligé de choisir un ordre de présentation global : par exemple pour SEXE, il va ordonner en fonction des effectifs dans la 1e tranche d'âge, et il n'en changera plus ensuite.
Code :
1
2
3
4
PROC TABULATE DATA=sashelp.class OUT=work.test ;
  CLASS age sex/ ORDER=FREQ MISSING;
  TABLE age * sex, N ;
RUN ;
On voit dans la table TEST que l'ordre n'est pas exact.

Une solution plus propre serait donc de reprendre ta table en sortie, intégrale, de la trier selon les fréquences décroissantes et de ne garder que les 20 premières lignes du résultat. Par exemple en SQL (ou en requête puisque tu sembles dans SEG).
Code :
1
2
3
4
5
6
PROC SQL OUTOBS=20 ;
  CREATE TABLE work.test20 AS
   SELECT COMPANYCODE, *&myTitle1 , N 
   FROM WORK.STAB&myTitle1
   ORDER BY N DESC ;
QUIT ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/03/2011, 15h43   #3
Invité de passage
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : mars 2011
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : mars 2011
Messages : 23
Points : 3
Points : 3
Tout d'abord, merci pour ta réponse.

J avais justement conscience du problème que tu as mentionné. Et j'avais déjà réfléchis à diverses solutions alternatives mais ce qui m a séduit avec la proc tabulate c'est la rapidité du temps de réponse ainsi que la mise en page du rapport automatique (enterprise guide).

Sinon sachant que je suis sous Guide n'y a-t-il pas un moyen d'obtenir une mise en page du même type à partir d'une table SAS quelconque sans forcément passer par la Tabulate ? (pour de grosses table elle me renvoie des résultats inutile et polluant le rapport)
walooze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 16h00   #4
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
Du coup j'ai envie de te proposer de reprendre les mêmes ingrédients mais dans un ordre différent :
données --> requête avec agrégation (calcul d'effectifs avec COUNT, rôle de GROUPE pour les autres variables concernées), tri par effectifs décroissants et limitation du nombre de lignes en sorties --> Tabulate pour mettre en forme cette table-là

Mais si tu veux une mise en forme sexy, malheureusement il n'y a pas beaucoup de procédures SAS à disposition : PRINT (un peu), TABULATE (l'aspect tableau croisé) et REPORT (celle que le gouvernement intersidéral appelle quand il n'est plus capable de trouver une solution à ses problèmes, quand il ne reste plus aucun espoir, et que même le Capitaine Flam a échoué).
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/03/2011, 17h08   #5
Invité de passage
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : mars 2011
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : mars 2011
Messages : 23
Points : 3
Points : 3
Effectivement, cette méthode fonctionne bien.
Mais sur des tables plus grosse la succession de requêtes imbriquées et de count pose certains problème de mémoire et de performance.
Pour ceux que ça intéresse j ai donc procédé comme suit :
table source
--> proc tabultate (pour calculer la fréquence)
-->plusieurs requêtes sql de type :
Code :
1
2
3
4
5
6
 PROC SQL OUTOBS=&nombre_a_restit ;
  CREATE TABLE work.DetailsFor&myTitle1 AS
   SELECT t1.COMPANYCODE, t1.&myTitle1 , t1.N 
   FROM WORK.&mytabulateOut AS t1 WHERE t1.companycode = [mypara]
   ORDER BY T1.N DESC ;
QUIT ;
--> on regroupe tous les résultats dans la même table/view (insert etc etc)
--> et enfin proc print

c'est très moche je vous l'accorde mais ça marche (j ai fait une croie sur ma mise en page sexy :p)
walooze 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 23h11.


 
 
 
 
Partenaires

Hébergement Web