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 :

Boucle suite proc transpose


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Boucle suite proc transpose
    Bonjour,

    J'ai une table issue d'un PROC transpose avec cette structure :

    ID_CPT (numérique)
    DAT_GES (format date)
    COL_1 (format date)
    COL_2 (format date)
    COL_3 (format date)
    .....

    Le nombre de COL_x pouvant varier car dépendant du résultat du pivot du PROC Transpose
    Pour chaque ID_CPT il n'y a pas le même nombre de COL_x renseigné (un IDT_CPT peut en avoir 3, un autre 15)

    j'ai besoin de réaliser 2 choses :
    - pouvoir mettre dans une macro-variable le nombre max de colonnes (COl-X) qui a été génére par le proc transpose
    - ensuite pour chaque ligne de ma table (pour chaque ID_CPT) tester si COl_x est compris dans l'intervalle (DAT_GES + 15) et si c'est le cas créer un TOP prenant comme valeur 1 (sinon 0)

    je dois donc pouvoir tester ça via une boucle (puisque dépendant du nombre de COL_x généré)
    le but est que le TOP prenne la valeur 1 si un (ou plus ) des tests pour un ID-CPT se vérifie (que j'ai 1 comparaison de date ou 10 qui sont dans l'intervalle (DAT_GES + 15), le TOP sera à 1 sinon à 0)

    Pouvez-vous m'aidez ? Je ne vois vraiment pas comment m'en tirer.

    Merci d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Pour ma première question je pensais travailler avec un ARRAY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Data MA_TABLE_final;
    set MA_TABLE;
    Array test (*) col: ;
    Do i=1 to dim(test) ;
    test(i) = /*parametre des conditions*/
    end;
    run;
    Ensuite c'est le second point qui me bloque car j'aimerais pouvoir tester ça en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if DAT_GES <= (col_&i + 15)  then do; top = 1;end;else do ;to = 0;end;end;
    Pour qu'au final, mon TOP, pour chaque ligne, soit à 1 ou 0 (1 si au moins une fois la condition s'est vérifié, 0 sinon)

  3. #3
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Boucle suite proc transpose
    Bonjour,

    j'ai besoin de réaliser 2 choses :
    - pouvoir mettre dans une macro-variable le nombre max de colonnes (COl-X) qui a été génére par le proc transpose
    Il me semble plus intéressant de récupérer l'information sur la table répétitive (avant la proc transpose).

    - ensuite pour chaque ligne de ma table (pour chaque ID_CPT) tester si COl_x est compris dans l'intervalle (DAT_GES + 15) et si c'est le cas créer un TOP prenant comme valeur 1 (sinon 0)
    Vous pouvez utiliser votre array ici. Avec la condition de votre deuxième message (DAT_GES <= COl_x + 15) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data test;
      input ID_CPT :8. DAT_GES :ddmmyy10. COL_1 :ddmmyy10. COL_2 :ddmmyy10. COL_3 :ddmmyy10.;
      format DAT_GES COL_1 COL_2 COL_3 ddmmyy10.;
      cards;
    1 20/01/2020 01/01/2020 15/01/2020 01/02/2020 .
    2 10/01/2020 01/01/2020 15/01/2020 01/02/2020 15/02/2020
    3 01/04/2020 16/01/2020 30/01/2020 16/02/2020 01/03/2020
    ;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data test;
      set test;
      array COL[3] COL_1-COL_3;
      do i = 1 to 3 until (top = 1);
        if DAT_GES <= COL[i] + 15 then top = 1; else top = 0;
      end;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID_CPT       DAT_GES         COL_1         COL_2         COL_3    i    top
    
       1      20/01/2020    01/01/2020    15/01/2020    01/02/2020    2     1
       2      10/01/2020    01/01/2020    15/01/2020    01/02/2020    1     1
       3      01/04/2020    16/01/2020    30/01/2020    16/02/2020    4     0
    Deux remarques :

    - Dans le premier message vous écrivez COl_x est compris dans l'intervalle (DAT_GES + 15) --> DAT_GES <= COl_x <= DAT_GES + 15 et dans le deuxièmes DAT_GES <= COl_x + 15.
    - Il n'est pas nécessaire d'ajouter des blocs do; ...; end; lorsqu'il y a une seule instruction

    Cordialement,

  4. #4
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    J'ai bien lu votre réponse et vous en remercie vivement. Désolé pour cette réponse tardive

    Je pense rencontrer un soucis, à mon avis dû au fait que les dates (dans les colonnes COLx) ne sont pas forcément triées systématiquement.
    J'ai refait un code (le nom des variables a changé) :

    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
     
    data sasuser.test;
    input IDT_AC :9. DAT_FIN :ddmmyy10. DAT_AUG :ddmmyy10.;
      format DAT_FIN DAT_AUG  ddmmyy10.;
      cards;
    100100100 20/01/2020 01/01/2020
    100100100 20/01/2020 21/01/2020
    100100100 20/01/2020 01/02/2020
    100100101 10/01/2020 01/01/2020
    100100101 10/01/2020 15/01/2020
    100100101 10/01/2020 01/02/2020
    100100101 10/01/2020 15/02/2020
    100100102 01/04/2020 16/01/2020
    100100102 01/04/2020 30/01/2020
    100100102 01/04/2020 16/02/2020
    100100102 01/04/2020 01/03/2020
    100100103 12/11/2019 16/01/2019
    100100103 12/11/2019 15/07/2019
    100100104 15/07/2014 13/12/2015
    100100104 15/07/2014 02/05/2017
    100100104 15/07/2014 28/07/2014
    100100104 15/07/2014 08/05/2013
    100100105 02/01/2021 .
    ;
    RUN;
     
    PROC SORT DATA = sasuser.test OUT = sasuser.test ;
      BY IDT_AC ;
    RUN ;
     
    PROC TRANSPOSE DATA = sasuser.test OUT = sasuser.test_TRANSPOSE(drop=_NAME_) ;
      BY IDT_AC DAT_FIN;
      VAR DAT_AUG ;
    RUN ;	
     
     
    data sasuser.resultat(drop=i);
    set sasuser.test_TRANSPOSE;
    array plage {*} col: ;
    do i=1 to dim(plage) until (top = 1);
    if plage{i} <= DAT_FIN <= plage{i} + 15 then top = 1; 
                                            else top = 0;end;
    run;
    Je ne comprends pas ce que j'ai mal fait car mon TOP ne correspond pas à ce que j'attends : DAT_FIN doit être compris dans l'intervalle compris entre COLx et COLx+15.

  5. #5
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Boucle suite proc transpose
    Bonjour,

    Je ne comprends pas ce que j'ai mal fait car mon TOP ne correspond pas à ce que j'attends : DAT_FIN doit être compris dans l'intervalle compris entre COLx et COLx+15.
    J'obtiens ceci en exécutant votre code. Pour moi tous les top sont OK. Qu'est-ce qui vous chagrine ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      IDT_AC        DAT_FIN          COL1          COL2          COL3          COL4    top
     
    100100100    20/01/2020    01/01/2020    21/01/2020    01/02/2020             .     0 --> OK
    100100101    10/01/2020    01/01/2020    15/01/2020    01/02/2020    15/02/2020     1 --> 01/01/2020 <= 10/01/2020 <= 01/01/2020 + 15 --> OK
    100100102    01/04/2020    16/01/2020    30/01/2020    16/02/2020    01/03/2020     0 --> OK
    100100103    12/11/2019    16/01/2019    15/07/2019             .             .     0 --> OK
    100100104    15/07/2014    13/12/2015    02/05/2017    28/07/2014    08/05/2013     0 --> OK
    100100105    02/01/2021             .             .             .             .     0 --> OK
    Personnellement je préfère travailler sur les données répétitives. Pourquoi ne pas faire votre test avant la transposition ?

    Cordialement,

  6. #6
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    en fait sur la première ligne on a : DAT_FIN = 20/01/2020 et COL2 = 21/01/2020
    donc je m'attendais à avoir mon TOP prenant une valeur à 1

  7. #7
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Boucle suite proc transpose
    Attention au sens de la comparaison.

    DAT_FIN doit être compris dans l'intervalle compris entre COLx et COLx+15
    DAT_FIN = 20/01/2020 < COL2 = 21/01/2020.

    Cordialement

  8. #8
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Tout à fait
    je ne sais pas ce que j'ai dans mes yeux aujourd'hui

    Sujet résolu
    Merci beaucoup pour votre aide !!

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

Discussions similaires

  1. Macro SAS: boucles de PROC's
    Par Lameth dans le forum Macro
    Réponses: 9
    Dernier message: 14/09/2009, 17h00
  2. proc transpose : mémoire insuffisante
    Par _debutant dans le forum SAS Base
    Réponses: 12
    Dernier message: 06/10/2008, 12h30
  3. Question Proc transpose
    Par didinet dans le forum SAS Base
    Réponses: 2
    Dernier message: 03/08/2008, 02h01
  4. boucle avec proc means
    Par nawal59 dans le forum Macro
    Réponses: 4
    Dernier message: 01/07/2008, 22h18
  5. Problème avec la proc Transpose
    Par ash_rmy dans le forum SAS Base
    Réponses: 3
    Dernier message: 07/04/2008, 11h16

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