Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > ODS et reporting
ODS et reporting Forum d'entraide sur les fonctionnalités de reporting de SAS : gérer les sorties et graphiques de SAS
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 24/05/2011, 14h19   #1
Invité régulier
 
Femme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 5
Points : 5
Par défaut define noprint pour certaines valeurs dans proc report

Bonjour,
je voulais savoir si il est possible de mettre noprint sur une variable across selon les valeurs de cette variable.

Concretement, j'ai une variable mois avec les valeurs janvier...décembre, et je voudrais mettre noprint pour les mois après mai.
Je ne peux pas mettre un where car j'ai besoin des valeurs des mois qui ne sont pas affichés. En effet, la première colonne de mon tableau fait la somme sur l'année,si je met un where j'ai le total que pour les 5 premiers mois.

Merci pour votre aide.
servane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h38   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Si tu met l'option across, une colonne va être créée pour chaque catégorie. Ta somme reflètera toutes les catégories, donc il me semble que ce que tu veux faire ne peut être effectué en une étape. Le noprint s'applique sur une variable.

A priori je partirais sur une solution en deux étape: je commencerais par créer une nouvelle (treizième) modalité correspondant à la somme annuelle.

Ensuite dans la proc report je génèrerais une sortie avec les 5 premiers mois et la somme (qui deviendra une sixième colonne dans ton across-> c'est bien la présentation que tu souhaites?)
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 15h16   #3
Invité régulier
 
Femme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 5
Points : 5
J'ai une table de départ qui est assez grosse. De plus, pour chaque mois, je regarde ensuite les valeurs pour différentes années. Ca me paraît donc compliqué de faire comme ca pour chaque année.

Est-ce qu'il n'y a pas possibilité de creer mon tableau pour les 12 mois et de demander à la proc report de me sortir que les 15 premières colonnes par exemple?
servane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h41   #4
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Peux tu fournir tes données (modifiées si gênant, ou seulement une partie tant que ça reste représentatif) ainsi ainsi que la présentation escomptée en sortie?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h05   #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
Bonjour Servane.
Si je comprends bien, tu as une colonne par mois et pas l'envie de voir les mois qui ne sont pas encore d'actualité pour certaines années.
Comme ceci ?
Code :
1
2
3
4
5
6
7
8
PROC REPORT DATA=sashelp.prdsale (WHERE=(month < "01APR1994"D))
			NOWD ;
	COLUMNS country year,(month,actual) ;
	DEFINE country / GROUP ;
	DEFINE year / ACROSS ORDER=INTERNAL ;
	DEFINE month / ACROSS ORDER=INTERNAL ;
	DEFINE actual / ANALYSIS SUM ;
RUN ;
Si ça ressemble à ce cas, tu ferais mieux de produire ton tableau avec une proc TABULATE qui est plus souple sur la mise en colonnes de certaines variables : ici tu n'auras directement que les colonnes pertinentes (ce qui n'empêche pas des totaux avec ALL).
Code :
1
2
3
4
5
PROC TABULATE DATA=sashelp.prdsale (WHERE=(month < "01APR1994"D)) ;
	CLASS year month country ;
	VAR actual ;
	TABLE country, year*month*actual*SUM="" ;
RUN ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h34   #6
Invité régulier
 
Femme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 5
Points : 5
Je ne peux pas utilisé la proc tabulate car j'ai besoin d'une mise en page précise sur mon tableau. J'ai besoin de mettre des couleurs différentes sur une même colonne en fonction d'une variable.

J'aimerai un tableau dans ce genre (voir piece jointe)

Dans la colonne annee 2010: je veux le total sur toute l'annee 2010
Dans la colonne annee 2011: je veux le total sur toute l'annee 2011
Après pour chaque mois, je veux les totaux pour chaque annee ainsi que l'evolution entre ces deux dates, mais je voudrais qu'il m'affiche les groupes de colonnes (2010 2011 evolution) seulement pour les mois de janvier à mai.

Si j'utilise un where=(mois<=mai) dans le total annee 2010, je n'ai pas les données de juin 2010 à décembre 2010.
Images attachées
Type de fichier : png Sans titre.png (11,5 Ko, 4 affichages)
servane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 07h54   #7
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
Comme proposait Manoutz, il faut décomposer en 2 étapes, 1 pour calculer les sommes annuelles (et les autres tant qu'on y est) puis REPORT avec un WHERE pour organiser tout ça.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ODS OUTPUT summary = work.stats ;
PROC MEANS DATA=sashelp.prdsale (WHERE=(month < "01APR1994"D))
			SUM ;
	VAR actual ;
	CLASS product year month ;
	TYPES product*year product*year*month ;
RUN ;
PROC REPORT DATA=work.stats (RENAME=(actual_sum=actual)
								 WHERE=(MONTH(month)<5))
			NOWD ;
	COLUMNS product year,actual month,(year=year2,actual=actual2) ;
	DEFINE product / GROUP ;
	DEFINE year / ACROSS ORDER=INTERNAL ;
	DEFINE actual / ANALYSIS SUM ;
	DEFINE year2 / ACROSS ORDER=INTERNAL ;
	DEFINE month / ACROSS ORDER=INTERNAL ;
	DEFINE actual2 / ANALYSIS SUM ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 25/05/2011, 10h01   #8
Invité régulier
 
Femme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 5
Points : 5
Bonjour Manoutz et Olivier!
J'ai suivi vos conseils et j'ai donc utilisé le code proposé par Olivier (sauf le
(WHERE=(month < "01APR1994"D)) dans la proc means car je ne comprends pas son utilité.
La proc means fonctionne bien, j'ai bien les totaux que j'attends.

Par contre, à l'exécution de la proc means je retrouve le même résultat qu'avant. J'ai toujours pour la somme de l'année, la somme des 5 premiers mois.

J'ai essayé de refaire une étape data après la proc means afin de créer une nouvelle variable (var1) qui vaut actual_sum si month=. et . sinon.
Dans la proc report j'ai ensuite changer

Code :
COLUMNS product year,actual month,(year=year2,actual=actual2) ;
par

Code :
COLUMNS product year,var1 month,(year=year2,actual=actual2) ;
et je n'obtiens que des valeurs manquantes pour le total à l'année.
servane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 17h06   #9
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Tu as du commettre quelques erreurs. Le code d'Olivier est particulièrement puissant. Chapeau bas..

J'ai rajouté quelques petites astuces pour bien coller à ta demande. Par contre je n'ai pas réussi à éviter une mini étape data pour renommer la catégorie "total" de la variable country - en tant que valeur manquante, elle n'est pas affichée.

Reste quelques modifs minimes pour gérer l'ordonnacement et les couleurs, mais c'est broutilles.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ODS OUTPUT summary = work.stats(WHERE=(month(month)<6)) ;
PROC MEANS DATA=sashelp.prdsale 
			SUM ;
	VAR actual ;
	CLASS product country year month ;
	TYPES product*year*month product*country*year product*country*year*month ;
RUN ;
 
DATA stats;
SET stats;
IF compress(country) IN ("") then country="TOTAL";
run;
 
ods pdf file="c:\est.pdf";
PROC REPORT DATA=work.stats (RENAME=(actual_sum=actual)
								 WHERE=(MONTH(month)<6))
			NOWD ;
	COLUMNS product  country year,actual month,(year=year2,actual=actual2) ;
	DEFINE product / GROUP ;
	DEFINE country / GROUP ;
	DEFINE year / ACROSS ORDER=INTERNAL ;
	DEFINE actual / ANALYSIS SUM ;
	DEFINE year2 / ACROSS ORDER=INTERNAL ;
	DEFINE month / ACROSS ORDER=INTERNAL ;
	DEFINE actual2 / ANALYSIS SUM ;
	compute year;
		IF country IN ("TOTAL") then call define(_row_,'style', 'style=[background=blue]');
 
		IF country IN ("CANADA") AND PRODUCT IN ("BED") then call define(_col_,'style', 'style=[background=yellow]');
	endcomp;
RUN ;
ods pdf close;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 19h24   #10
Invité régulier
 
Femme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 5
Points : 5
Merci à tous les deux, ca y est cela fonctionne. Finalement dans la proc report j'ai marqué

COLUMNS product month,(year=year2,actual=actual2) ;

et j'ai ajouté missing dans le define de la variable month.
Ainsi, sas considère la valeur . de la variable mois comme le total à l'année..et hop ca fonctionne!!

Merci encore à Manoutz et Olivier.
servane 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 14h14.


 
 
 
 
Partenaires

Hébergement Web