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 :

Condition IF dans une étape Data


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Condition IF dans une étape Data

    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
     
     A                     B                C
    110                 135         TROC
    110                 01           TROC
    110                 122         TROC
    111                 135         MELANGE
    111                  44          MELANGE
    111                  01          MELANGE
    111                 122         MELANGE
    112                   44          VENTE
    222                 135          TROC
    423                 135          MELANGE
    423                   04          MELANGE
    423                   01          MELANGE
    543                  122         MELANGE
    543                   44         MELANGE
    877                   01           TROC
    877                 135           TROC
    la regle dit:
    Pour la meme variable A; si B egale a 135, 01 et 122
    donc c'est le TROC donc C doit egale à 'TROC' comme le montre le tableau ci-dessus .

    si pour la meme variable A; si B egale un melange entre 44 et (135,
    01 ,122) Alors c'est le cas mixte et C doit egale a 'MELANGE'.


    pour A donné et unique, si B soit egale a 44 donc
    C doit egale à 'VENTE'

    pour A donné et unique, si B soit egale a (135 ou
    01 ou 122) donc C doit egale à 'TROC'.

    merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    Bonjour, ( un peu de politesse ? )

    - Quelle est la question ?
    - BALISE CODE !!
    - les messages de type SOS , HELP ne servent à rien ...

    Bien cordialement

    rom

  3. #3
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Citation Envoyé par lelensois16 Voir le message
    Bonjour, ( un peu de politesse ? )
    rom

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    Voici une petite piste qui devrait vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc sql ; 
    create table Compte As 
    (
    select  A , B , C , count(A) As Compteur 
    from test 
    group by A  
    );
    run ;
    A partir de la , il suffira de faire un jeu de IF (2 fois il me semble , à cause de 'MELANGE')

    Cdt

  5. #5
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut problème persiste
    Bonjour,

    désolé pour mon précédent message, car je viens de commencé a travailler et je doit rendre cette tache ce soir au plus tard ; je remercie lelensois16, Mais le problème c'est que j'ai pas sue comment faire le jeux IF



    cordialement

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    J'ai commencé ça mais j'ai pas eu le temps de finir.
    à toi de choisir pour chaque ligne, quele variables gardée parmis les 3.

    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
    data test;
    input A B C $;
    cards;
    110 135 TROC
    110 01 TROC
    110 122 TROC
    111 135 MELANGE
    111 44 MELANGE
    111 01 MELANGE
    111 122 MELANGE
    112 44 VENTE
    222 135 TROC
    423 135 MELANGE
    423 04 MELANGE
    423 01 MELANGE
    543 122 MELANGE
    543 44 MELANGE
    877 01 TROC
    877 135 TROC
    ;
    run;
     
    proc sort data=test;
    by A;
    run;
     
    data test2;
    set test;
    by A;
    if b in (135 1 122) then C_troc='trOC';
     if b  in (44 135 1 122) then C_melange='melange';
    run;
     
    data test3;
    set test2;
    if B=44 then c_vente='vente';
    if b in (135 1 122) then C_troc_bis='trOC';
    run;

  7. #7
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par MEGAMIND2 Voir le message
    J'ai commencé ça mais j'ai pas eu le temps de finir.
    à toi de choisir pour chaque ligne, quele variables gardée parmis les 3.

    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
    data test;
    input A B C $;
    cards;
    110 135 TROC
    110 01 TROC
    110 122 TROC
    111 135 MELANGE
    111 44 MELANGE
    111 01 MELANGE
    111 122 MELANGE
    112 44 VENTE
    222 135 TROC
    423 135 MELANGE
    423 04 MELANGE
    423 01 MELANGE
    543 122 MELANGE
    543 44 MELANGE
    877 01 TROC
    877 135 TROC
    ;
    run;
     
    proc sort data=test;
    by A;
    run;
     
    data test2;
    set test;
    by A;
    if b in (135 1 122) then C_troc='trOC';
     if b  in (44 135 1 122) then C_melange='melange';
    run;
     
    data test3;
    set test2;
    if B=44 then c_vente='vente';
    if b in (135 1 122) then C_troc_bis='trOC';
    run;

    Bonjour,
    merci pour votre reponse je vais voir si ça va marché
    crdt

  8. #8
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut ça persiste
    Citation Envoyé par MEGAMIND2 Voir le message
    J'ai commencé ça mais j'ai pas eu le temps de finir.
    à toi de choisir pour chaque ligne, quele variables gardée parmis les 3.

    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
    data test;
    input A B C $;
    cards;
    110 135 TROC
    110 01 TROC
    110 122 TROC
    111 135 MELANGE
    111 44 MELANGE
    111 01 MELANGE
    111 122 MELANGE
    112 44 VENTE
    222 135 TROC
    423 135 MELANGE
    423 04 MELANGE
    423 01 MELANGE
    543 122 MELANGE
    543 44 MELANGE
    877 01 TROC
    877 135 TROC
    ;
    run;
     
    proc sort data=test;
    by A;
    run;
     
    data test2;
    set test;
    by A;
    if b in (135 1 122) then C_troc='trOC';
     if b  in (44 135 1 122) then C_melange='melange';
    run;
     
    data test3;
    set test2;
    if B=44 then c_vente='vente';
    if b in (135 1 122) then C_troc_bis='trOC';
    run;
    RE
    je l'ai fais comme sa avant
    il marche pas, merci comme même

  9. #9
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par SASMAN Voir le message
    Bonjour,
    merci pour votre reponse je vais voir si ça va marché
    crdt
    bonjour,
    mon problème actuellement c'est que le code il distingue pas les cas ou le nombre est indistinguable

    Merci d'avance

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    Justement , via les jeux d'IF et le tableau d'occurences vous devez réussir l'exercice. Un numéro est unique si son occurence est égal à 1

  11. #11
    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
    Effectivement le compteur permet d"avancer avec les IF.
    Par contre à compteur identique et valeur de B similaire le problème demeure.

    Dans le code ci -dessus malgré le By A il y a un problème d'affectation de TROC ou MELANGE
    C_BIS doit être égale C.
    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
     
    proc sql ; 
    CREATE TABLE Compte AS 
    (
    SELECT  A , B , C , count(A) AS Compteur 
    FROM test 
    GROUP BY A  
    );
    QUIT ; 
     
    DATA test;
    SET compte;
    BY A;
    attrib C_BIS length=$10.;
    IF compteur=1 and B=44 then C_bis='VENTE'; 
    IF compteur=1 and B IN (135 1 122) then C_bis='TROC'; 
     
    IF compteur=2 and b IN (135 1 ) then C_bis='TROC';
    IF compteur=2 and b IN (122 44) then C_bis='MELANGE';
     
    /*problème à ce niveau*/
    IF compteur=3 and b IN (1 135 122) then C_bis='TROC';
    IF compteur=3 and b IN (1 135 4) then C_bis='MELANGE';
     
    IF compteur=4  and B IN (44 135 1 122 4) then C_bis='MELANGE';
     
    run;

  12. #12
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par MDsas Voir le message
    Effectivement le compteur permet d"avancer avec les IF.
    Par contre à compteur identique et valeur de B similaire le problème demeure.

    Dans le code ci -dessus malgré le By A il y a un problème d'affectation de TROC ou MELANGE
    C_BIS doit être égale C.
    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
     
    proc sql ; 
    CREATE TABLE Compte AS 
    (
    SELECT  A , B , C , count(A) AS Compteur 
    FROM test 
    GROUP BY A  
    );
    QUIT ; 
     
    DATA test;
    SET compte;
    BY A;
    attrib C_BIS length=$10.;
    IF compteur=1 and B=44 then C_bis='VENTE'; 
    IF compteur=1 and B IN (135 1 122) then C_bis='TROC'; 
     
    IF compteur=2 and b IN (135 1 ) then C_bis='TROC';
    IF compteur=2 and b IN (122 44) then C_bis='MELANGE';
     
    /*problème à ce niveau*/
    IF compteur=3 and b IN (1 135 122) then C_bis='TROC';
    IF compteur=3 and b IN (1 135 4) then C_bis='MELANGE';
     
    IF compteur=4  and B IN (44 135 1 122 4) then C_bis='MELANGE';
     
    run;
    Bonjour,

    merci pour votre réponse mais le but de l’exercice c'est de remplir la colonne C selon la règle de gestion, et il faut impérativement q'on suit cette règle de gestion qui dit:
    Pour la meme variable A; si B egale a 135, 01 et 122
    donc c'est le TROC donc C doit egale à 'TROC' comme le montre le tableau ci-dessus .

    si pour la meme variable A; si B egale un melange entre 44 et (135,
    01 ,122) Alors c'est le cas mixte et C doit egale a 'MELANGE'.


    pour A donné et unique, si B soit egale a 44 donc
    C doit egale à 'VENTE'

    pour A donné et unique, si B soit egale a (135 ou
    01 ou 122) donc C doit egale à 'TROC'.

    merci d'avance

  13. #13
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    Février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    Je comprends que pour un même A, les valeurs de C sont identiques, aussi je pense qu'il faut faire en 2 étapes : d'abord on détermine dans quel cas on est pour chaque A (étape data avec first et last), ensuite on écrit les valeurs (jointure cartésienne).

    J'ai pris la liberté de dire que par défaut, A c'est TROC, sauf si on a rencontré un B 44 (ou 04 a priori d'après le jeu de tests) .

    Je propose donc ceci :


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    /* jeu de tests*/
    DATA ResultatVoulu;
    input A $ B $ C $;
    cards;
    110 135 TROC
    110 01 TROC
    110 122 TROC
    111 135 MELANGE
    111 44 MELANGE
    111 01 MELANGE
    111 122 MELANGE
    112 44 VENTE
    222 135 TROC
    423 135 MELANGE
    423 04 MELANGE
    423 01 MELANGE
    543 122 MELANGE
    543 44 MELANGE
    877 01 TROC
    877 135 TROC
    ;
    run;
     
    proc sort DATA=ResultatVoulu out=ds1 (drop=C);
    BY A B;
    run;
     
    /* on détermine le cas de chaque A */
    data ds2 (keep=A C) ; 
    length C $15. ;
    retain C ;
      set ds1 ;
      by A;
    /* Pour la meme variable A; si B egale a 135, 01 et 122 - C doit egale à 'TROC')*/
    /* pour A donné et unique, si B soit egale a (135 ou 01 ou 122) donc C doit egale à 'TROC'. */
    If first.A=1 then C='TROC';
     
     
    /* si pour la meme variable A; si B egale un melange entre 44 et (135, 01 ,122) - C doit egale a 'MELANGE'. */
    If B not in ('135', '01' ,'122') then C='MELANGE';
     
    /* pour A donné et unique, si B soit egale a 44 - C doit egale à 'VENTE' */
    If first.A=1 and last.A=1 and B='44' then C='VENTE';
     
    If last.A=1 then output ;
     
      run ;
     
    /* jointure cartésienne*/
    proc sql ;
      create table ds3 as
      select * from ds1,ds2 where ds1.A=ds2.A;
      quit ;


    Géraldine Cade
    Support Clients SAS

  14. #14
    Candidat au Club
    Homme Profil pro
    SAS
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : SAS
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 2
    Points
    2
    Par défaut proposition cohérente
    Citation Envoyé par Géraldine_Cade_SAS Voir le message
    Bonjour,

    Je comprends que pour un même A, les valeurs de C sont identiques, aussi je pense qu'il faut faire en 2 étapes : d'abord on détermine dans quel cas on est pour chaque A (étape data avec first et last), ensuite on écrit les valeurs (jointure cartésienne).

    J'ai pris la liberté de dire que par défaut, A c'est TROC, sauf si on a rencontré un B 44 (ou 04 a priori d'après le jeu de tests) .

    Je propose donc ceci :


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    /* jeu de tests*/
    DATA ResultatVoulu;
    input A $ B $ C $;
    cards;
    110 135 TROC
    110 01 TROC
    110 122 TROC
    111 135 MELANGE
    111 44 MELANGE
    111 01 MELANGE
    111 122 MELANGE
    112 44 VENTE
    222 135 TROC
    423 135 MELANGE
    423 04 MELANGE
    423 01 MELANGE
    543 122 MELANGE
    543 44 MELANGE
    877 01 TROC
    877 135 TROC
    ;
    run;
     
    proc sort DATA=ResultatVoulu out=ds1 (drop=C);
    BY A B;
    run;
     
    /* on détermine le cas de chaque A */
    data ds2 (keep=A C) ; 
    length C $15. ;
    retain C ;
      set ds1 ;
      by A;
    /* Pour la meme variable A; si B egale a 135, 01 et 122 - C doit egale à 'TROC')*/
    /* pour A donné et unique, si B soit egale a (135 ou 01 ou 122) donc C doit egale à 'TROC'. */
    If first.A=1 then C='TROC';
     
     
    /* si pour la meme variable A; si B egale un melange entre 44 et (135, 01 ,122) - C doit egale a 'MELANGE'. */
    If B not in ('135', '01' ,'122') then C='MELANGE';
     
    /* pour A donné et unique, si B soit egale a 44 - C doit egale à 'VENTE' */
    If first.A=1 and last.A=1 and B='44' then C='VENTE';
     
    If last.A=1 then output ;
     
      run ;
     
    /* jointure cartésienne*/
    proc sql ;
      create table ds3 as
      select * from ds1,ds2 where ds1.A=ds2.A;
      quit ;


    Géraldine Cade
    Support Clients SAS
    Bonsoir,
    merci pour votre réponse, je vais la tester demain matin, mais votre proposition me parais cohérente, et vous avez bien compris le problème .

    Cordialement

Discussions similaires

  1. Condition IF dans une étape DATA
    Par salmabarik dans le forum SAS Base
    Réponses: 8
    Dernier message: 03/08/2013, 03h22
  2. Macro ne fonctionne pas dans une étape DATA
    Par cladoo dans le forum Macro
    Réponses: 2
    Dernier message: 07/11/2011, 09h36
  3. Boucle dans une étape data
    Par ueshiba dans le forum Macro
    Réponses: 3
    Dernier message: 26/05/2009, 11h21
  4. Réponses: 3
    Dernier message: 11/08/2008, 15h56
  5. Réponses: 1
    Dernier message: 30/05/2008, 14h52

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