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 :

une colle sur une boucle


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut une colle sur une boucle
    Bonjour tout le monde,

    J'ai presque honte de poser ma question ... BOn allez je me lance.

    Je souhaite dans une table sommer certaines lignes.
    J'ai une manip' en deux temps avec un merge qui me prend un temps fou.

    Un exemple sera plus parlant ...

    Je souhaite passer de ça :

    Eleve matiere note age
    thomas histoire 8 15
    caroline histoire 10 16
    caroline Geo. 20 16
    pascal histoire 6 14
    pierre histoire 8 15

    à ça :

    Eleve matiere note age nature
    thomas histoire 8 15 note
    caroline histoire 15 16 moyenne
    pascal histoire 6 14 note
    pierre histoire 8 15 note

    C'est dingue, il doit y avoir des boucles et ça c'est ma hantise...

    Vous imaginez bien que c'est pour le faire sur un fichier de mini 100 000 lignes et que la restriction porte non pas sur une variable 'Eleve', mais sur au moins 3 variables. Lorsqu'elles sont identiques, il faut sommer (faire une moyenne dans notre exemple).

    ça ne sera pas des notes, c'est juste pour l'exemple

    SI quelqu'un à une idée...
    Merci par avance,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Une proc means répondrait à ton problème

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Bonjour blastfr, pas de boucle pour répondre à ton problème.

    Par contre une jolie procédure sql.

    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
     
    data note;
    input Eleve $ matiere $ note age;
    cards;
    thomas histoire 8 15
    caroline histoire 10 16
    caroline Geo. 20 16
    pascal histoire 6 14
    pierre histoire 8 15
    run;
     
    proc sql ;
    create table moyenne
    as select  Eleve
    			, MAX(matiere) as matiere 
    			, MEAN(note) as note 
    			, case when count(*) > 1 then 'moyenne' else 'note' end as nature 
    			, MAX(age) as age
    from note
    group by Eleve
    ;
    quit;

    Les statistiques max pour matiere et age sont là pour supprimer les lignes qui font doublon (le group by a cet effet de "suppression" lorsque les grandeurs sont des statistiques qui portent sur toutes les lignes de modalité(s) "group by" identique(s)). Le max d'une chaine de caractères ne signifie pas grand chose mais si peut t'importe le choix de la matière à conserver c'est la solution la plus simple à mettre en oeuvre.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Genial,

    Merci SASADM, je vais tester ta proc sql sur ma big table ce week-end !

  5. #5
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut inobs et outobs
    salut,
    avec la procedure sql, pour tester rapidemment du code sur des tables volumineuses tu peux utiliser les options inobs et outobs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    proc sql inobs=100; 
    create table... /* seules les  100 premieres lignes de la table en entree sont lues */
     
     
    proc sql outobs=100;
    create table...  /* la procédure s'arrete dès que le nombre de lignes de la table de sortie atteint 100 */

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Merci SASADM

    Bien la proc sql !

    J'utilise les stats max pour garder les variables dont les valeurs sont ls mêmes pour differentes observation rattaché à Eleve (par exemple).

    Par contre tu es obligé de faire un "AS SELECT Eleve" et un "GROUP BY Eleve". Je pensais que ça faisait double emploi.

    Encore merci à toi !

    Julien

  7. #7
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Salut,

    le group by eleve fait que tes statistques sont calculées par élève: MEAN(note) te donnera la moyenne de l'élève.

    Enlève le group by eleve de l'exemple que je t'ai donné. Tu verras que les statistques sont calculées sur toutes les observations : MEAN(note) te donne la moyenne de la classe.

    Le deuxième effet du group by est de supprimmer les lignes en double lorsque toutes les grandeurs retournés sont des statistiques (MEAN, MAX, MEAN, SUM, etc). D'où l'écriture de MAX(matiere) et MAX(age).

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. afficher une valeur sur une feuille lorsqu'une checkbox est cochée
    Par chrnoe dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2008, 14h39
  3. probleme avec l'appui sur une touche sur une jframe ou jdialog
    Par jeanfeu dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 05/08/2008, 16h14
  4. [VBA Excel] Appliquer une macro sur une celulle contenant une valeur
    Par tchauviere dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2008, 10h21
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

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