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 :

Creation conditionnelle de variable dans la table resultante


Sujet :

SAS Base

  1. #1
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut Creation conditionnelle de variable dans la table resultante
    Bonjour,

    Dans une etape date je crée des variables dans une boucle en fonction des mois. MN_1_2010....MN_i_2010.
    Maintenant je voudrais créer ma variable MN_31_DEC_2010 UNIQUEMENT si mon mois =12.
    Je sais comment créer des tables conditionnelles (if...then output nom_table) mais comment fait-on avec des variables?.
    J'ai tenté le coup avec if &mois=12 then put MN_31_DEC_2010 =montant;

    PS:J'ai appliqué la fonction rechercher pour trouver un sujet similaire mais j'ai pas eu mon bonheur.

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut

    c'est tout simple:

    if ... then do;
    new_var=val;
    output table;
    end;

    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
     
     
    data t;
    a=1;output;
    a=2;output;
    run;
    data t1 t2; set t;
    if a=1 then do;
    	b=2;
    	output t1;
    end;
    else do;
    	b=3;
    	output t2;
    end;
    run;
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  3. #3
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Tu peux créer autant de variable que tu veux avant l'output.
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  4. #4
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Merci cependant la solution que tu me propose crée deux tables en sorties avec une valeur différente de b selon la condition sur a.

    Moi je voudrais que b se créée uniquement pour une valeur existante de a. Sinon je ne voudrais pas de b dans ma table de sortie.
    Mais j'ai l'impression que le fait même de faire appel à b dans la conidition suffit pour la créée dans le resultat.

    Ce que je voudrais serait comme un keep ou un drop conditionnel.
    A défaut j'afficherais toujours la variable et elle aura une valeur quand ma condition sera remplie. (il y a plus qu'à vendre cela au client !...si vous n'avez pas de solution évidemment).

    Merci.

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Mais comme tu l'indiques Mariam, c'est juste une affaire de KEEP ou de DROP !
    Si tu ne veux pas la variable X dans la table T1 mais par contre, dans T2, tu fais
    Bon courage.
    Olivier

  6. #6
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    J'ai rien contre la creation d'une autre table mais ce que je veux vraiment c'est :
    pour la même table en SORTIE la creation ou pas d'une variable en fonction d'une variable existante dans la table en ENTRÉE.
    Si on s'inspire du cas plus haut avec a et b.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATA t;
    input a mois;
    cards;
    1 12
    2 12
    run;
    j'ai une table T avec
    a mois
    1 12
    2 12

    Voici l'illustration du résultat souhaité: une table t1
    de la forme:
    SI mois = 12 (cdt remplie) b=2;
    T1 vaut
    a mois b
    1 12 2
    2 12 2

    SINON (mois ne 12)

    T1 vaut
    a mois
    1 12
    2 12

    Merci de vos retours.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut y qu'à demander
    Attention: dans ton dataset résultat, tu as ou pas la colonne b, mais pas pour certaines lignes oui et pour d'autres non, cela n'a pas de sens.
    Ici dès qu'une des lignes contient 12 on garde la colonne b:

    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
    /* Exemple ou a vaut 12 pour au moins une ligne */
     
    /* Créer l'exemple */
    data data;
    a=12;
    b=5;
    run;
     
    /* Suppose pas de a=12=> drop */
    %let drop_col = drop b;
    data data;
    set data;
    /* Si on détecte au moins une ligne avec a=12 on garde la colonne=>annuler le drop */
    if a eq 12 then call symput('drop_col', '');
    run;
    /* faire le drop quand il y a lieu */
    data data;
    set data;
    &drop_col;
    run;
     
    /* Exemple 2: aucune ligne avec a=12 */
    data data;
    a=11;
    b=5;
    run;
     
    %let drop_col = drop b;
    data data;
    set data;
    if a eq 12 then call symput('drop_col', '');
    run;
    data data;
    set data;
    &drop_col;
    run;

  8. #8
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Ton exemple par du fait que b existe déjà et je la supprime selon la condition sur a.
    Dans mon cas b n'existe pas à la base je la crée que lorsque ma condition sur a est remplie (a prend la même valeur sur toutes les lignes c'est un paramètre de ma macro). Ce n'est pas la même approche.

    Peut être le contexte vous éclairera sur le besoin:

    J'ai une table avec des clients.
    Pour chacun des clients j'ai l'historique de ses prestations (peut être des rentes inval, des rentes de retraite....)
    Exemple:
    Cl1 mt_31_DEC_2001...mt_31_DEC_2006....mt_1_2010...mt_7_2010
    25 100 500 50 50
    Pour tous les montants avant l'année en cours, j'ai les montants au 31 DEC et pour mon année en cours je ventile par les montants mensuels.
    Dans l'exemple je suis au mois de juillet.
    Je fais des stats tous les mois, j'ai donc une variable macro qui s'incrémente à travers une boucle.
    Arrivée en décembre (donc mt_12_2010) j'ai une année complète donc je voudrais avoir mt_31_DEC_2010 de rajouter à ma table avant de débuter les mensuels de 2011.
    Je ne voudrais pas afficher cette variable tant que l'on est pas arrivé en décembre.

    Comme je disais plus haut à défaut de solution je l'afficherai quand même toute l'année et elle ne sera alimentée que rendu en décembre.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/09/2007, 11h15
  2. enregistrer des variables dans une table via requete sql
    Par Echizen1 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/09/2006, 15h15
  3. Réponses: 3
    Dernier message: 02/05/2006, 15h25
  4. [SQL] calcul de plusieurs variables dans une table
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2006, 21h53
  5. creation d'une variable dans un composant ?
    Par renard s dans le forum Composants VCL
    Réponses: 4
    Dernier message: 20/12/2005, 01h10

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