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

ODS et reporting Discussion :

Simplification de fusion de deux tables


Sujet :

ODS et reporting

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juillet 2010
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juillet 2010
    Messages : 160
    Points : 97
    Points
    97
    Par défaut Simplification de fusion de deux tables
    Bonjour a tous,

    j'ai réalisé des rapports automatisés sur sas en créant en fonction d'une variable d'identification un rapport a chaque fois.
    Dans ce rapport je réalisé essentiellement des proc tabulate. Probleme maintenant on me demande de rajouter une colonne total ^^(effetif et fréquence)
    Je travaille sur une base de données de 500 000 lignes donc je créé une table temporaire pour chaque rapport, du coup l'ajout de cette colonne me pose probleme et si je calcule ca avant et que je fais une jointure, (actuellment sous sql) ca me parait bien compliqué pour quelque chose de tres simple.
    Sans parler du fait que n'etant plus dans ma proc transpose je n'arrive plus a utiliser tous mes libellés


    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    %macro controlequalite;
    proc sort DATA=alz.coherence out=alz.centres(keep=utilisateur) nodupkey; BY utilisateur;run;
    proc sort DATA=alz.coherence; BY utilisateur;run;
    DATA _null_;
    SET alz.centres;
    /*permet de creer une liste contenant centre avec un numero avec un nom de centre associé*/
    call symputx('centre'||left(trim(_n_)),utilisateur);
    /*compte le nombre de centres*/
    call symput('nb_centre',_n_);
    run;
     
    /*genere une table avec le nom et le nombre de corpus.*/
    proc freq data=alz.coherence;
    tables utilisateur/ out=alz.sortieb nocum noprint;
    run;
     
    DATA _null_;
    SET alz.sortieb;
    /*permet de creer une liste contenant centre avec un numero avec un nom de centre associé*/
    call symputx('nb_corpus'||left(trim(_n_)),count);
    run;
     
    /*enregistre dans une table temporaire les stat nationales sur les incoherences de l'age*/
    	proc tabulate DATA=alz.coherence out=coherenceage;
    	Class coh_age /	ORDER=DATA ;
    	KEYLABEL n='Fréquence (n)' pctn='%';
    	Table coh_AGE=''  all="Nombre de patients",
    	N pctn;
    	run;
     
    /*boucle qui parcours tous les centres*/
    %do i=1 %TO nb_centre.;
     
    DATA temp (keep= centrenom centrenum typecentre creationmois utilisateur coh_age);
    SET alz.coherence;
    IF utilisateur="&&centre&i" then output;
    run;   
    /*permet de connaitre le nombre d'acte en fonction du centre en fonction du temps*/
    	proc freq data=alz.bna_coherence (where=(utilisateur="&&centre&i"));
    	tables creationmois/ out=alz.sortietemp nocum noprint;
    	run;
     
    /*Ouvres un document rtf avec un nom generique portant le nom du centre*/
    	ODS _all_ close;
    ods listing close;
    options nodate nonumber;
    ods noptitle;
     
     
     
    	proc tabulate DATA=temp out=travail1;
    	Class coh_age /	ORDER=DATA ;
    	KEYLABEL n='Fréquence (n)' pctn='%';
    	Table coh_AGE=''  all="Nombre total d'actes",
    	N pctn;
    	run;
     
     
     
    ods  rtf  file="\\acopier\&&centre&i...rtf"  /* pour supprimer le saut de page startpage=never*/;
     
    ods escapechar="^";
     
    /* retire le titre des procedures dans le fichier resultat*/
    ods noproctitle;
    options center;
     
    title "TABLEAU DE BORD";
    title2 "Rapport Automatisé du &sysdate";
    title3 "&&centre&i..";
     
    title4 "Tableau de controle de cohérence";
    ods rtf startpage=now;
    ods rtf startpage=never;
    options nocenter;
     
     
    /*tableau croisé permettant d'avoir le detail des incoherences sur l'age*/
    ods rtf text='^S={font=(Arial) fontsize=11pt fontweight=bold}{Tableau 1 : Analyse des âges extrêmes}';
     
    proc sql;
    	SELECT travail1.coh_age, travail1.n as nb_centre, travail1.pctn_0 as freq_centre, coherenceage.n as nb_nat,
    	coherenceage.pctn_0 as freq_nat
    FROM travail1 RIGHT JOIN coherenceage ON travail1.coh_age = coherenceage.coh_age;
    quit;
     
    	/*referme le document rtf*/
    ods _all_ close;
    /*termine la boucle*/
    %end;
    %mend;

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Julien.
    Je ne suis pas certain de comprendre tous les enjeux de ta question, mais à la place de cette grosse boucle macro et de la collecte d'identifiants qui précède, j'aurais juste mis un BY dans la proc TABULATE (et une option NEWFILE=BYGROUP dans l'ODS RTF). Tu aurais ainsi, automatiquement, autant de fichiers Word que de centres. Quant à ce que tes tableaux contiennent exactement ce que tu veux, là encore j'ai l'impression que tu compliques : une proc Freq + une proc Tabulate + une proc SQL = 1 tableau, si j'ai bien compris. Tabulate ne peut pas tout faire ? Alors peut-être qu'une proc Report pourrait.
    Enfin, tu évoques une proc Transpose, je ne la vois pas dans ton programme.

    Pour le mélange "stats globales + stats détaillées", mieux qu'un BY, un niveau de page dans la proc TABULATE. Et un NEWFILE=PAGE dans ODS RTF pour avoir autant de documents que souhaité. Voici un exemple : il pourrait y avoir 30 valeurs différentes pour SEX, on aurait 30 documents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ODS RTF FILE="c:\temp\test1.doc" NEWFILE=PAGE ;
    PROC TABULATE DATA=sashelp.class ;
      CLASS sex age ;
      TABLE sex="Sexe=", /* 1 page par sexe */
               age ALL="Total dans ce sexe",
                 N="Effectif"
                       COLPCTN="% dans ce sexe"
                       REPPCTN="% du total"
        / BOX=_page_
      ;
    RUN ;
    ODS RTF CLOSE ;
    Bon courage.
    Olivier

Discussions similaires

  1. Fusion de deux tables
    Par Au pays des stats dans le forum SAS Base
    Réponses: 6
    Dernier message: 21/05/2012, 21h09
  2. [AC-2007] fusion de deux tables
    Par ALEX80800 dans le forum Modélisation
    Réponses: 2
    Dernier message: 08/01/2012, 13h26
  3. [DATA] fusion de deux tables
    Par petit-ours dans le forum SAS Base
    Réponses: 2
    Dernier message: 07/09/2010, 16h53
  4. fusion de deux tables
    Par petit-ours dans le forum SAS Base
    Réponses: 2
    Dernier message: 27/07/2010, 09h38
  5. Fusion de deux tables : MERGE ou SET
    Par Flynt dans le forum SAS Base
    Réponses: 10
    Dernier message: 23/06/2008, 11h51

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