Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro 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 17/07/2008, 15h18   #1
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Par défaut [Macro] Une bêtise de SAS ?

1. J'ai une table avec des index et je fais une proc sql avec un where assez simple : where EX_TECH = 2006. Tout est OK, SAS utilise bien l'index.
2. Au lieu d'utiliser la constante dans mon code, je crée une variable macro %let anneeFin = 2006; Ma clause where devient where EX_TECH = &anneeFin. C'est toujours OK, index est utilisé.
3. Je change un peu la clause pour avoir where EX_TECH = &anneeFin. - 1. Là c'est KO - index n'est plus utilisé, le temps de calcul est multiplié par 10.
4. Je change de nouveau where = %eval(&anneeFin. - 1) - c'est de nouveau OK pour l'utilisation d'index.

Ce n'est pas vraiment une question, plutôt une observation. je suis étonné, je ne comprends pas pourquoi where EX_TECH = 2005 (la commande après le processeur des macros de p.4) est différent de where EX_TECH = 2006 - 1 (la commande après le processeur des macros de p.3) ?
Une bêtise de SAS ?
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 19h05   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Ce n'est pas lié à SAS, C'est le SQL qui réagit comme ça.
pour chaque enregistrement il fait uns soustraction
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 10h43   #3
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Tu plaisantes ? N'importe quel préprocesseur du SQL reconnaît "2006 - 1" comme une constante. Bon, pas n'importe quel, sauf celui de SAS.
Je suis vraiment désagréablement surpris. Faites gaffe les gars.
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 17h44   #4
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Je dirai que c'est un problème d'affectation. En effet avec une fonction, SAS utilise bien l'index :

where EX_TECH = sum(&anneeFin. , -1)

A noter au passage, pour voir si SAS utilise ou non un index :

options msglevel=I;

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
DATA test;
	input annee;
	cards;
	2006
	2005
	2004
	2006
	2006
	2006
	2005
	;
run;
proc sql;
	CREATE INDEX annee ON test(annee); 
quit;
options msglevel=I;
proc sql ;
	SELECT *
	FROM test
	WHERE annee=sum(2006,-1);
quit;
__________________
Avant de poser votre question, n'oubliez pas :
FAQ, SAS DOC et de ce forum
steelspirit 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 21h31.


 
 
 
 
Partenaires

Hébergement Web