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 :

Proc transpose et tri des colonnes


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Proc transpose et tri des colonnes
    Bonjour à tous,

    Je recherche une réponse à ma question un peu partout et je ne trouve pas donc si vous pouviez m'aider, ça serait vraiment génial.

    Je fais la proc transpose ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc transpose data=canal2 out=canal3;
       by CODE LIBELLE;
       var SOMME;
       ID ANNEE;
    run;
    Le résultat de mon tableau me met bien les années en colonne mais pas dans l’ordre hiérarchique.
    Le soucis, c'est qu'il me les faut absolument dans l'odre et avant de faire ma proc transpose, je doit trier sur le code sinon ça ne fonctionne pas.

    Est-ce que quelqu'un aurait une idée ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Ne trie pas la table. Une petite modification au niveau de l'instruction By :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    by CODE LIBELLE notsorted;
    Le notsorted indique à SAS que la table n'est pas triée et qu'on peut malgré utiliser le BY.

    Cdt Ward

  3. #3
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ca fonctionne effectivement. Par contre, comme mes données ne sont plus tréies par code, j'ai maintenant une ligne par code pour chaque année .

    ex :
    code 1 / 2007 / 24
    code 1 / 2008 / 12
    ...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Tu peux poster un exemple même fictif afin qu’on puisse te proposer la réponse adéquate(car c’est un sujet un peut délicat). Par contre si le résultat de la PROC TRANSPOSE (avec le trie) te convient sauf que les années ne soient pas dans l’ordre hiérarchique voici une proposition à l’aide de l’instruction « RETAIN » :
    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 sort data=canal2 ;  by CODE LIBELLE;  run ;
    
    proc transpose data=canal2 out=canal3;
    by CODE LIBELLE;
    var SOMME;
    ID ANNEE;
    run;
    
    data canal4 ;
    /*  tu place ici les variables dans l’ordre hiérarchique souhaité  */
    retain  CODE ANNEE1 ANNEE2….. ANNEE10 ; 
    set canal3;
    run ;

  5. #5
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Le retain ne fonctionne pas car il ne considère pas mes années comme des varaibles

    Je réalise, en gros, le code suivant pour avoir ma table de base :

    proc sql ;
    select
    CODE,
    count (toto) as SOMME,
    ANNEE
    from b.matable
    group by CODE,ANNEE

    Ensuite, je fais ma proc transpose et j'obtiens un tableau avec mes années en colonne mais comme les 1ers codes n'ont pas de valeurs avant 2014, j'ai la colonne 2014 qui apparait en 1er.

    Je peux donner un exemple plus détaillé mais je ne sais pas comment faire

  6. #6
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Bonjour,

    En utilisant le code de Hossward :

    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
    proc sql ;
    create table canal2 as
     select  country, region, SUM(actual)  as SOMME,year
     from sashelp.prdsale
     group by country, region,year 
     order by country, region,year ;
    quit ;
     
    proc transpose data=canal2 out=canal3(drop=_name_) prefix=Annee_;
    by country region;
    var SOMME;
    ID year;
    run;
     
    data canal4 ;
    /*  tu place ici les variables dans l’ordre hiérarchique souhaité  */
    retain  country region annee_1994 annee_1993  ; 
    set canal3;
    run ;
    ça fonctionne.

    Autrement tu peux essayer cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    proc sql noprint ;
    create table canal4 as
     select  country, region
    		, SUM(IFN(year= 1993,actual,.))  as annee_1993
    		, SUM(IFN(year= 1994,actual,.))  as annee_1994
     from sashelp.prdsale
     group by country, region
     order by country, region ;
    quit ;

  7. #7
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Aucune de ces fonction ne marche car SAS ne me considère plus ni la somme, ni les années comme des varibles.caracteristique_table.7z

  8. #8
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    ça ne devrait pas changer grand chose à la solution de Hossward.

    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
    proc sql ;
    create table canal2 as
     select  country, state, SUM(actual)  as SOMME, PUT(year,4.) as year
     from sashelp.prdsal2
     group by country, state,year 
     order by country, state,year ;
    quit ;
    proc transpose data=canal2 out=canal3(drop=_name_) prefix=Annee_;
    by country state;
    var SOMME;
    ID year;
    run;
    data canal4 ;
    /*  tu place ici les variables dans l’ordre hiérarchique souhaité  */
    retain  country state annee_1998 annee_1997 annee_1996 annee_1995   ; 
    set canal3;
    run ;

    Autrement, avec une proc sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    proc sql noprint ;
    create table test as
     select  country, state
    		, SUM(case when PUT(year, 4.) = "1995" then actual else . end)  as annee_1995
    		, SUM(case when PUT(year, 4.) = "1996" then actual else . end)  as annee_1996
    		, SUM(case when PUT(year, 4.) = "1997" then actual else . end)  as annee_1997
    		, SUM(case when PUT(year, 4.) = "1998" then actual else . end)  as annee_1998
     from sashelp.prdsal2
     group by country, state
     order by country, state ;
    quit ;

    Est ce que tu peux nous montrer le message d'erreur de la log et un extrait de ta table ?

  9. #9
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Effectivement, j'avais fait une mauvaise manip et ça fonctionne .
    Par contre, mon tableau va tourner en automatique tous les mois. En préparant dans mon code annee_2016... est-ce que ça fonctionnera ?
    Merci beaucoup pour votre aide

  10. #10
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Ne passe pas la seconde solution en sql.

    Tu auras ta colonne annee_2016 directement en sortie de la proc transpose.

  11. #11
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    c'est à dire que je fais :

    data canal4 ;
    retain country region annee_2016 ... annee_1994 annee_1993 ;
    set canal3;
    run ;

    c'est ça ?

  12. #12
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Citation Envoyé par petrauda Voir le message
    c'est à dire que je fais :

    data canal4 ;
    retain country region annee_2016 ... annee_1994 annee_1993 ;
    set canal3;
    run ;

    c'est ça ?
    ça dépend de ce que tu souhaites avoir en sortie :
    si tu veux les années décroissantes oui, autrement si tu as toutes tes années présentes dans la table, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data canal4 ;
    retain  country region annee_1993-annee_2016  ; 
    set canal3;
    run ;

  13. #13
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    ca serait beaucoup plus simple mais j'ai peur que ça ne soit pas accepté.
    Merci beaucoup pour votre aide, je peux mettre le sujet résolu

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

Discussions similaires

  1. [2.3.0] CrossTab tri des colonnes
    Par fredo38 dans le forum BIRT
    Réponses: 0
    Dernier message: 29/10/2008, 15h06
  2. Datable tri des colonnes
    Par xian21 dans le forum C#
    Réponses: 3
    Dernier message: 27/10/2008, 17h26
  3. Tri des colonnes au choix
    Par nora_ora dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2005, 17h11
  4. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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