IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Paramétrer une proc sql dans un macro programme


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Paramétrer une proc sql dans un macro programme
    Bonjour,
    dans mon macro programme j'ai un code redondant mais que je n'arrive pas à coder en proc sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data work.table (drop=variable);
    		set work.table;
    		by variable2;
    		if first.variable2 then
    			calcul=1;
    		else
    			calcul+1;
    		if last.variable2;
    			mois="janvier";
    	run;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    data  work.table1 (keep = v1 v2 v3)
    		  work.table2;
    		merge work.table1(in = A)
    	          work.table3   (in = B);
    		by v1;
    			if A then 
    				output work.table1;
    			if A and not B then
    				output work.table2;
    	run;
    Merci d'avance de votre aide !!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour

    Qu'appelle tu code redondant ?
    Quel est le lien entre le premier code et le deuxième ?
    Que veux tu réellement faire ?

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur Statisticien
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Statisticien
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 59
    Points
    59
    Par défaut
    Bonjour statisticien35,

    La question posée est effectivement plutôt obscure, néanmoins il n'est pas très compliqué d'adapter ces étapes DATA en PROC SQL

    Pour la première, voici un code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    DATA table;
    input variable2 variable$ calcul mois$;
    cards;
    0 J0 2 x
    0 J4 2 x
    0 J7 2 x
    0 J14 2 x
    0 J21 2 x
    0 J28 2 x
    0 J42 2 x
    0 J56 2 x
    1 J7 6 x
    1 J14 6 x
    1 J0 6 x
    1 J21 6 x
    1 J56 6 x
    2 J0 6 x
    2 J7 6 x
    2 J14 6 x
    2 J42 6 x
    ;
    run;
    proc sql noprint;
    	create table table3 as
    	select table_N_.variable2, table_N_.variableunique,
    		table_N_._N_-first_N_+1 as calcul, 
    		CASE WHEN table_N_._N_=last_N_ then "janvier" ELSE mois END as mois
    	from 
    		(select monotonic() as _N_, variable2, variableunique, calcul, mois from table) table_N_
    	left join
    		(select table_N_.variable2,
    				table_N_._N_, table_first_N_.first_N_
    		from
    			(select monotonic() as _N_, variable2, calcul, mois from table) table_N_
    		left join
    			(select min(_N_) as first_N_, max(_N_) as last_N_, variable2
    			from
    				(select monotonic() as _N_, variable2,  calcul, mois from table) table_N_
    			group by variable2) table_first_N_
    		on (table_N_.variable2=table_first_N_.variable2)
    		) as table_N_et_first
    	on (table_N_.variable2=table_N_et_first.variable2 
    		and table_N_._N_=table_N_et_first._N_
    		)	
    	;
    quit;
    Le code semble imbuvable, mais c'est parce que les instructions de jointure récursives sont obligatoires pour deux raisons :
    1. SAS n'a pas implémenté de fonction analytique dans ses PROC SQL (ce serait vraiment, vraiment un plus qu'ils s'y mettent enfin )
    2. l'accès aux lignes en SQL n'a rien à voir avec la logique 'vecteur' des étapes DATA, et SAS n'a pas intégré d'homologue à _N_ dans ses codes SQL. Seule la fonction monotonic() (non documentée au passage...) s'en approche.

    Pour la seconde, étape DATA il est nécessaire de faire 2 instructions SQL dans une même PROC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    proc sql noprint;
    	create table table1bis as 
    	select table1.v1, v2, v3 
    	from table1 
    	left join table3
    	on (table1.v1=table3.v1);
     
    	create table table2 as 
    	select table1.v1, v2, v3 
    	from table1 
    	full outer join table3
    	on (table1.v1=table3.v1)
    	where table3.v1=.;
    quit;

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2010, 17h02
  2. Definir un format décimal dans une proc SQL
    Par pierre24 dans le forum SAS Base
    Réponses: 1
    Dernier message: 07/08/2008, 09h36
  3. Erreur %goto et proc sql dans une macro
    Par raf64flo dans le forum Macro
    Réponses: 15
    Dernier message: 17/04/2008, 22h40
  4. Réponses: 1
    Dernier message: 10/02/2008, 20h13
  5. Réponses: 3
    Dernier message: 28/08/2007, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo