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

Macro Discussion :

Compteur d'incrémentation inefficient


Sujet :

Macro

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut Compteur d'incrémentation inefficient
    Bonjour !

    Je souhaiterais calculer le nombre d'individus dans une "série". Le problème est que ces individus peuvent apparaître dans plusieurs "groupes" (donc plusieurs variables à gérer).
    Je voudrais donc calculer le nombre d'individus de la série S dans la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    data test;input serie1 $ serie2 $ groupe1 groupe2;cards;
    S L 1 2
    S L 9 3
    S S 4 5
    L L 8 7
    L S 10 11
    L S 12 13
    ;
    run;
    Le nombre à calculer est donc 1 + 9 + 4 (pour le groupe 1) +5 + 11 + 13 (pour le groupe 2), soit un total de 43. J'ai tenté le code suivant, mais cela ne donne pas le résultat attendu !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %macro m;
    data test;
       retain somme;
       set test(drop=somme);
       somme = sum(lag(somme),   %do i = 1 %to %eval(&n.-1); (serie&i.='s') * note&i.  , %end;
                          (serie&n.='s') * note&n )
    ;
     
    run;
    %mend m;
    %m
    Merci pour votre aide !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 83
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Si j'ai bien compris ce que tu veux faire, j'utiliserai plutot du sql, puisque tu souhaite faire des sommes de variables différentes

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    proc sql;
    create table result as
    select serie,sum(groupe) as total
    from (
    (select serie1 as serie,groupe1 as groupe from test)
    union 
    (select serie2 as serie,groupe2 as groupe from test)
    )
    group by serie;
    quit;
    je ne comprends pas le code que tu as posté. d'où vienne &note et &n?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Merci.

    Je vais essayer de tester ton code SQL. A mon avis, il y a moyen de faire marcher avec du SAS pur avec la fonction lag. Mais il est assez difficile de comprendre comment cette fonction "fonctionne" (ou pas ...)

    Désolé : note&i est en fait groupe&i. et la macro-variable N représente le nombre de groupes (2, dans mon exemple-test)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Je l'ai testé pour 2 groupes : ça marche bien. Pour 3 groupes, par contre, ça ne me donne pas le résultat attendu. Mais le principe me paraît bon. Je vais voir pourquoi ça coince à 3 groupes (sans doute un problème de parenthésage car j'en ai supprimé quelques-unes par souci de clarté !)

    Merci encore !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    En fait, il faut ajouter un petit mot pour que cela fonctionne tout à fait correctement. En effet, lorsqu'on effectue l'union des tables intermédiaires, SQL supprime automatiquement les doublons, ce qui fausse mes résultats. Pour que tout soit dans l'ordre, il faut remplacer UNION par UNION ALL et tout marche impec !

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

Discussions similaires

  1. compteur s'incrémente mal
    Par gastoncs dans le forum VB.NET
    Réponses: 2
    Dernier message: 15/09/2011, 22h37
  2. Mon compteur n'incrémente pas
    Par louay02 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/05/2011, 19h36
  3. Gérer les compteurs Auto Incrémentés sous firebird
    Par the watcher dans le forum Bases de données
    Réponses: 32
    Dernier message: 26/12/2009, 22h42
  4. un compteur non incrémenté
    Par NulenVBA dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/12/2008, 17h06
  5. Importer des données et compteur auto incrémenté
    Par lutecefalco dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/04/2007, 10h27

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