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

Débutez Discussion :

Ajout ligne en fonction des autres


Sujet :

Débutez

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Ajout ligne en fonction des autres
    Bonjour,

    J'aimerais savoir comment ajouter une ligne à ma table en fonction des autres.
    2 A
    4 B
    5 C
    7 D
    3 E

    Comment puis - je rajouter ces lignes :
    6 AB
    8 CE
    21 Total

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Salut,

    Ce sont uniquement ces lignes que tu veux ajouter ? Cela me semble compliqué mais tu peux te servir de la fonction LAG :

    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 __test;
    input num char $;
    cards;
    2 	A
    4 	B
    5 	C
    7 	D
    3 	E
    ;
    run;
     
    data __test2;
    	set __test (where=(num ne 7));
    	num2 = num+lag(num);
    	char2 = compress(lag(char)||char);
    run;
    Pour le total tu peux le faire avec une PROC SQL.

    alers

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre réponse.

    Ce sont juste des lignes effectivement. Je ne pensais pas que cela aurait été si compliqué.
    Une proc SQL ? Une fonction me permettrait d'obtenir ça, je vais y jeter un oeil alors.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Le soucis avec cette méthode étant que cela m'ajoute deux autres colonnes, ce qui n'est pas ce à quoi j'essaye d'arriver.
    Éventuellement, je pourrais isoler ces données dans une table et concaténer le tout mais bon, j'imagine qu'il y a plus simple.

    N'y a t-il pas moyen de passer par un update dans une proc sql ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Personnellement je ne comprend pas ce que tu souhaites obtenir... Tu veux rajouter des lignes uniquement pour AB et CE ou est-ce qu'il faut faire tous les couples possibles ? Est-ce que tu as besoin d'une table que tu pourras manipuler ou juste un tableau par une proc report suffira ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'ai généré la table ci dessus avec une proc sql.

    J'aurais besoin de rajouter des lignes à cette table avec juste quelques couples que je définirais moi même. Ici, juste les couples AB et CE ainsi que ABCDE (Total). De façon à avoir ce genre de résultat.

    2 A
    4 B
    5 C
    7 D
    3 E
    6 AB
    8 CE
    21 Total

    J'aimerais en sortie une table que je peux manipuler.

  7. #7
    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,
    C'est une possibilité :
    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
     
    data Test ;
    input num lettre $ ;
    retain grp ; 
    if lettre in('A', 'C') then grp+1 ; 
    cards ;
    2 	A
    4 	B
    5 	C
    7 	D
    3 	E
    ; run ;  
     
    data Test1 (keep=num lettre) ;
    do until ( last.grp ) ;	  
    set Test end=fin ;	total+num ; by grp notsorted ; output ;
     
    if first.grp then do ; Fnum=num ; Flet=lettre ;	end ;
    if  last.grp then do ; Lnum=num ; num=Lnum+Fnum ;  
                           Llet=lettre ; Lettre=cats(Flet, Llet) ;	output ; 
                      end ;
    if fin then do ; num=total ; lettre='Total' ; output ; end ;
    end ;
    run ;
    Ward

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Très bien alors voici ce que je te propose :
    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
     
    data test;
    input num char $;
    cards;
    2 	A
    4 	B
    5 	C
    7 	D
    3 	E
    ;
    run;
     
    data _null_;
    set test;
    call symputx (char, num);
    run;
     
    %let couple =AB CE;
     
    data test2 (drop = p i);
    set test end=last;
    p + num;
    output;
    if last then do;
    	do i=1 to countw(strip("&couple."));
    		char = scan(strip("&couple."),i);
    		num = symget(substr(char,1,1)) + symget(substr(char,2,1));
    		output;
    end;
    char = 'Total';
    num = p;
    output;
    end;
    run;
    Tu peux choisir les couples que tu souhaites obtenir dans la macro variable "couple" et le programme fera le reste !

    Bon courage!

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci à tout les deux. Je ne suis pas contre une explication de vos codes, si possible étape par étape.

    Le second contient d'ailleurs quelques erreurs selon ma log.
    Pour le premier, comment puis - je me servir de la fonction Retain en sachant que ma table a été généré à l'aide d'autres tables et que je ne l'ai pas crée ainsi.

  10. #10
    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
    Citation Envoyé par iGaia Voir le message
    Comment puis - je me servir de la fonction Retain en sachant que ma table a été généré à l'aide d'autres tables et que je ne l'ai pas crée ainsi.
    Voici la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data test ;
    set Tatable ;
    retain grp  ; 
    if lettre in('A', 'C') then grp+1 ; 
    run ;

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci, je vais tester ça.

    Ceci étant, serais - ce possible d'avoir une petite explication du fonctionnement de ce code ? J'avais testé le précédent en entrant mes réelles valeurs et j'ai eu quelques soucis.
    Lexplication me permettant de pouvoir les corriger par moi même

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par iGaia Voir le message
    Merci, je vais tester ça.

    Ceci étant, serais - ce possible d'avoir une petite explication du fonctionnement de ce code ? J'avais testé le précédent en entrant mes réelles valeurs et j'ai eu quelques soucis.
    L'explication me permettant de pouvoir les corriger par moi même
    Voici la sortie que j'obtiens en remplaçant mes valeurs :
    Nom : 1442318772-test.png
Affichages : 988
Taille : 5,4 Ko

    Et voici la vôtre :
    Nom : test.png
Affichages : 951
Taille : 6,0 Ko

  13. #13
    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,
    J'ai adapté le code pour ta base en désactivant l'option KEEP afin de mieux voir le déroulement du programme sachant que FQuant et LQuant (F comme First, L comme Last) sont les variables prenant respectivement la 1ère valeur et la dernière valeur de la variable Quantity (Idem pour la variable Trx).
    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
     
    data Tatable ;
    input Trx$ Quantity  ;
    cards ;
    GRA 2
    GRB 4
    GRC 5
    GRD 7
    GRE 3
    ; run ;  
     
    data test ;
    set Tatable ;
    retain grp  ; 
    if Trx in('GRA', 'GRC') then grp+1 ; 
    run ;  
     
    data Test1 ; *(keep=Trx Quantity) ;
    do until ( last.grp ) ;	  
    set Test end=fin ;	Total+Quantity ; by grp notsorted ; output ;
     
    if first.grp then do ; FQuant=Quantity ; FTrx=Trx ;	end ;
    if  last.grp then do ; LQuant=Quantity ; Quantity=LQuant+FQuant ;  
                           LTrx=Trx ; Trx=catx('_', FTrx, LTrx) ; output ; 
                      end ;
    if fin then do ; Quantity=Total ; Trx='Total' ; output ; end ;
    end ;
    run ;
    Ward

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Voici une option en Format très basique. En espérant que cela vous Aide.

    Cordialement,
    Véronique

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    *je crée le data set pour l'exemple;
    data one;
       x=2; y='A'; output;
       x=4; y='B'; output;
       x=5; y='C'; output;
       x=7; y='D'; output;
       x=3; y='E'; output;
    run;
     
    *je crée un data set contenant la valeur pour A+B;
     
    *je ne garde que les observations où on a A et B;
    *je crée de nouvelles variables tot_x et tot_y où j'applique un retain;
    *ainsi en ligne deux, je fais la somme de la ligne précédente (ligne 1) et de la ligne actuelle;
    *je ne garde que la dernière ligne; 
    *j'identifie la dernière ligne au moyen de l'option end= ;
    *je choisi le nom eof pour end of file que je réutilise par la suite mais je peux choisir un autre nom;
    *je renomme et ne garde que les variables qui m'intéresse.
     
    data ab (drop=x y rename=(tot_x=x tot_y=y));
       set one (where=(y in ('A','B'))) end=eof;
       length tot_y $5;
       retain tot_x 0 tot_y ' ';
       tot_x+x;
       tot_y=cats(tot_y,y);
       if eof then output;
    run;
     
    *je crée un data set contenant la valeur pour C+D (même méthode que précémment);
     
    data cd (drop=x y rename=(tot_x=x tot_y=y));
       set one (where=(y in ('C','D'))) end=eof;
       length tot_y $5;
       retain tot_x 0 tot_y ' ';
       tot_x+x;
       tot_y=cats(tot_y,y);
       if eof then output;
    run;
     
    *je crée un data set contenant le total (même méthode que précémment);
     
     
    data tot (drop=x y rename=(tot_x=x tot_y=y));
       set one  end=eof;
       length tot_y $5;
       retain tot_x 0 tot_y ' ';
       tot_x+x;
       tot_y=cats(tot_y,y);
       if eof then output;
    run;
     
    *je mets les résultats bout à bout;
     
    data new;
       length x 8 y $5;
       set one
           ab
           cd
           tot;
    run;
     
    proc print data=new;
    run;

Discussions similaires

  1. [XL-2007] Retirer un ligne en fonction des valeurs d'une colonne
    Par CaraLePoke dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/10/2012, 18h14
  2. Réponses: 3
    Dernier message: 28/06/2011, 16h07
  3. Réponses: 2
    Dernier message: 20/03/2011, 01h17
  4. Réponses: 0
    Dernier message: 27/05/2010, 16h24
  5. StringGrid ajout de ligne en fonction des données
    Par thierrybatlle dans le forum Delphi
    Réponses: 3
    Dernier message: 26/05/2006, 13h58

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