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

SAS Base Discussion :

Utilisation de l'instruction ARRAY


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut Utilisation de l'instruction ARRAY
    Bonjour,

    Je suis actuellement en stage et je suis bloqué dans mon programme SAS.

    j'ai une base qui contient entre autre une variable Numéros de contrat et une variable Année:


    Mon but est de récupérer que les contrats présent en 2009, 2010 et 2011.

    Par exemple Les contrats présent en 2009 et 2010 ne m'intéresse pas.

    Je pense à l'instruction ARRAY, mais je n'arrive pas à l'utiliser.

    Pouvez-vous m'aider?

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut Instruction ARRAY
    Qd je dis les contrats présent sur les 3 années, il s'agit bien évidement des même numéros de contrats

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Si j'ai bien compris le problème, il faut utiliser 2 variables pour repérer les contrats (cf voir table d'exemple que j'ai créée) et si c'est le cas alors les array ne me semble pas une bonne idée. Les array sont utiles pour travailler en colonne et non en ligne.

    De plus il manque des informations pour pouvoir aider, est ce qu'il faut conserver toutes les lignes pour ces contrats ou juste obtenir la liste de ceux ci ? Et ce que les contrats qui font 2009, 2010, 2011 et 2012 doivent être gardés ? Voici un exemple de code quand même :

    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
     
     
    data test;
    input numero_contrat year;
    cards;
    1 2009
    1 2010
    1 2011
    2 2010
    3 2009
    3 2009
    4 2009
    4 2010
    4 2011
    5 2009
    5 2010
    5 2011
    5 2012
    ;
    run;
     
    data toto (drop= p year);
    set test;
    by numero_contrat;
    if first.numero_contrat then p=0;
    if year in (2009:2011) then p+1;
    if last.numero_contrat and p=3;
    run;
     
    proc print;run;
    Ce code te donne la liste des contrats qui ont au moins 2009, 2010 et 2011

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut ARRAy
    Bonjour et merci de m'avoir répondu:

    effectivement j'aurai du être plus précis:

    J'ai une base:

    Annee Num_Ctr

    2009 225566
    2010 589963
    2011 489877
    2009 536956
    2010 225566
    2011 225566
    2010 889878
    etc...

    J'ai essayer de faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data lib1.ant_2011 ; 
    set  lib1.toto;
    if num_ctr=num_ctr  and annee in ("2009" "2010" "2011") then output lib1.ant_2011;
    run;
    Mais la je récupére effectivement les contrats présent en 2009-2010 et 2010 mais aussi les contrats qui sont par exemple présent en 2009-2010 ou 2009 seulement... alors que moi je veux seulement les contrats qui sont présent sur les 3 années exemple:

    Num_CTR ANNEE

    AAAA 2009
    AAAA 2010
    AAAA 2010
    BBBB 2009
    BBBB 2010
    BBBB 2011
    CCCC 2009
    CCCC 2010
    CCCC 2011

    ETC...

    Sachant que chaque année le numéros de contrat est unique.

    Merci

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    Oui je dois garder les variables année et num_CTR et au final le but est d'obtenir une table qui ressemble à l’exemple ci dessus

  6. #6
    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,

    as tu essayé le code de Flo. Ne correspond-t-il pas à ce que tu recherche ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    J'ai testé le code de flo, mais je garde dans ma base aussi des contrat présent qu'en 2009-2010, 2010-2010... alors que moi je veux garder que les contrats présent sur les 3 années

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Re bonjour,

    le code risque de ne pas être beau mais je n'ai pas vraiment le temps de faire un truc opti dsl ! En fait mon premier code donnait une partie de la réponse mais si tu veux retrouver toutes tes lignes par numero de contrat ainsi que garder uniquement pour ces 3 années alors ceci devrait le faire :

    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
     
     
    data test;
    input numero_contrat year;
    cards;
    0 2008
    0 2009
    0 2010
    1 2009
    1 2010
    1 2011
    2 2010
    3 2009
    3 2009
    4 2009
    4 2010
    4 2011
    5 2009
    5 2010
    5 2011
    5 2012
    ;
    run;
     
    data toto (drop= p year);
    set test;
    by numero_contrat;
    if first.numero_contrat then p=0;
    if year in (2009:2011) then p+1;
    else p + (-1);
    if last.numero_contrat and p=3;
    run;
     
    proc sql;
    create table all_contrat as 
    select * 
    from test
    where numero_contrat in (select numero_contrat from toto);
    quit; 
     
    proc print;run;

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    Gd merci FLO le code marche.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    Salut Flo,

    Pouvez-vous m'expliquer le premier programme que Flo a écrit ?

  11. #11
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Hum je vois que j'ai oublié de répondre à ta question... Je ne sais pas si ça t'es toujours utile mais je vais le faire maintenant, ça pourra toujours aider d'autres personnes..
    Tu cherchais donc à repérer les contrats qui étaient en 2009, 2010 et 2011 uniquement et je t'avais proposé une solution qui est la suivante :

    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
     
     
    data toto (drop= p year);
    set test;
    by numero_contrat;
    if first.numero_contrat then p=0;
    if year in (2009:2011) then p+1;
    else p + (-1);
    if last.numero_contrat and p=3;
    run;
     
     
    proc sql;
    create table all_contrat as 
    select * 
    from test
    where numero_contrat in (select numero_contrat from toto);
    quit;
    Dans l'étape data j'initialise un compteur lorsque c'est la première fois que je vois un contrat (la table étant triée par contrat). Si l'année est 2009 ou 2010 ou 2011 alors j'augmente de 1 cette variable, si ce n'est pas le cas je retranche 1. Pour que "p" soit égal à 3 il n'y a qu'une seule possibilité c'est que le contrat débute en 2009 et termine en 2011. Je demande à SAS de n'output que les contrats qui ont p=3 lorsque c'est la dernière ligne du contrat en question que j'observe. J'aurai donc une liste qui va regrouper uniquement 1 ligne par contrat et ceux qui sont présent sur ces 3 ans. Cependant tu n'auras qu'une ligne par contrat alors que tu souhaitais garder la totalité des infos pour ceux-ci. La proc SQL va donc garder toutes les infos de ta table initiale pour les contrats qui apparaissent dans la table créée avec l'étape data.
    Voilà pour l'explication !

    Flo00154

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    une grand merci Flo

    Ps: désolé de répondre tardivement


    Citation Envoyé par flo00154 Voir le message
    Hum je vois que j'ai oublié de répondre à ta question... Je ne sais pas si ça t'es toujours utile mais je vais le faire maintenant, ça pourra toujours aider d'autres personnes..
    Tu cherchais donc à repérer les contrats qui étaient en 2009, 2010 et 2011 uniquement et je t'avais proposé une solution qui est la suivante :

    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
     
     
    data toto (drop= p year);
    set test;
    by numero_contrat;
    if first.numero_contrat then p=0;
    if year in (2009:2011) then p+1;
    else p + (-1);
    if last.numero_contrat and p=3;
    run;
     
     
    proc sql;
    create table all_contrat as 
    select * 
    from test
    where numero_contrat in (select numero_contrat from toto);
    quit;
    Dans l'étape data j'initialise un compteur lorsque c'est la première fois que je vois un contrat (la table étant triée par contrat). Si l'année est 2009 ou 2010 ou 2011 alors j'augmente de 1 cette variable, si ce n'est pas le cas je retranche 1. Pour que "p" soit égal à 3 il n'y a qu'une seule possibilité c'est que le contrat débute en 2009 et termine en 2011. Je demande à SAS de n'output que les contrats qui ont p=3 lorsque c'est la dernière ligne du contrat en question que j'observe. J'aurai donc une liste qui va regrouper uniquement 1 ligne par contrat et ceux qui sont présent sur ces 3 ans. Cependant tu n'auras qu'une ligne par contrat alors que tu souhaitais garder la totalité des infos pour ceux-ci. La proc SQL va donc garder toutes les infos de ta table initiale pour les contrats qui apparaissent dans la table créée avec l'étape data.
    Voilà pour l'explication !

    Flo00154

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de l'instruction instanceof
    Par menzlitsh dans le forum Langage
    Réponses: 10
    Dernier message: 02/11/2009, 16h54
  2. Utilisation de l'instruction "uses"
    Par LuckyLuke56 dans le forum Outils
    Réponses: 2
    Dernier message: 05/08/2008, 22h52
  3. Réponses: 1
    Dernier message: 30/05/2008, 14h52
  4. Utilisation de l'instruction UNION
    Par aloha dans le forum JPA
    Réponses: 3
    Dernier message: 28/04/2008, 20h13
  5. [XI] Utilisation de l'instruction IIF
    Par tatayoyo dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 28/03/2007, 14h20

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