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 STAT Discussion :

Comparaison de deux tableaux


Sujet :

SAS STAT

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut Comparaison de deux tableaux
    Bonjour tout le monde,
    j'ai deux tableaux qui ont les mêmes variables à comparer et à mettre le résultat dans un troisième tableau. Donc j'ai concaténer les tableaux et j'ai utiliser proc tabulate. Mais j'ai eu un souci au niveau de l'affichage de résultat
    voila un exemple des tableaux que j'ai et le code que j'ai utlisé
    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
    data table1;
    input variete $marque $ mois $ tariff ;
     
    cards;
    chocolat choco14 1 140
    chocolat choco14 2 250
     
    ;run;
    data table2;
    input variete $ marque $ mois $ tarif ;
     
    cards;
    chocolat choco15 1 140
    biscuit bg15 1 152
    biscuit bg15 1 152
    chocolat choco15 2 250
    biscuit bs15 2 150
    biscuit bs15 3 148
     
     
    ;run;
    data concat;
    set table2 table1;
     
    proc format ;
    value $ moiss
    '1'='Janvier'
    '2'='Février'
    '3'='Mars';
    run;
    ODS TAGSETS.EXCELXP 
     
    FILE='D:\Desktop\marque\test5.xls' options(Sheet_Interval="None" style="XLStatistical") ;
     
    proc tabulate data=concat S=[FOREGROUND=BLACK CELLWIDTH=200 JUST=C];
     
    class variete mois marque;
    classlev marque /s=[CELLWIDTH=100];
    var tarif;
    table variete=''*marque='', mois=''*tarif=''*sum='' all=''*tarif='Total'*sum=''/  box={label='marque'  s=[ JUST=R ]}  rts=25   ;
    format mois  $moiss. ;
    run;
    ODS TAGSETS.EXCELXP CLOSE;
    ODS LISTING;
    c'est ce que j'ai eu en résultat
    Nom : Capture1.JPG
Affichages : 260
Taille : 22,3 Ko
    Le problème est que je veux que les mêmes marques de 2015 et 2014 soient existantes dans le tableau résultat même si les tarifs sont nuls
    Voila le résultat que je dois avoir
    Nom : Capture1.JPG
Affichages : 295
Taille : 30,3 Ko

  2. #2
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut
    C'est possible d'avoir le résultat avec la procédure compare?

  3. #3
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    je partirai sur une table de référence qui croiserai déjà les variétés, les marques et les mois puis je mettrai dedans les tarifs issus de ces deux tables. la première pourrait s'obtenir par un CROSS JOIN ou FULL JOIN de tes deux tables puis pour le rapatriement des tarifs tu peux faire un merge ou SQL.
    Ensuite tu l'affiches avec une proc PRINT ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  4. #4
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut
    Comment puis je le faire avec cross join ou full join?

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution avec proc tabulate.

    Une colonne des valeurs vides est apparue dans le tableau croisé. (je ne connais le moyen de la supprimer)

    Si cela ne pose pas de problème, voici comment j'ai procédé:

    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
     
    data table1;
    input variete $marque $ mois $ tarif ;
     
    cards;
    chocolat choco14 1 140
    chocolat choco14 2 250
     
    ;run;
    data table2;
    input variete $ marque $ mois $ tarif ;
     
    cards;
    chocolat choco15 1 140
    biscuit bg15 1 152
    biscuit bg15 1 152
    chocolat choco15 2 250
    biscuit bs15 2 150
    biscuit bs15 3 148
    ;run;
     
    data ref;
    input variete $ marque $;
    cards;
    chocolat choco14
    chocolat choco15
    biscuit bg15
    biscuit bg14
    biscuit bs15
    biscuit bs14
    ;run;
     
     
    proc sort data=table1; by variete marque;run;
    proc sort data=table2; by variete marque;run;
    proc sort data=ref; by variete marque;run;
     
    data fin;
    merge table1 table2 ref;
    by variete marque;
    run;
     
     
    proc format ;
    value $ moiss
    '1'='Janvier'
    '2'='Février'
    '3'='Mars';
    run;
    ODS TAGSETS.EXCELXP 
     
    FILE='c:\sas\test5.xls' options(Sheet_Interval="None" style="XLStatistical") ;
     
    proc tabulate data=fin missing;
     
    class variete mois marque;
    classlev marque /s=[CELLWIDTH=100];
    var tarif;
    table variete=''*marque='', mois=''*tarif=''*sum='' all=''*tarif='Total'*sum=''/  box={label='marque'  s=[ JUST=R ]}  rts=25   ;
    format mois  $moiss. ;
    run;
    ODS TAGSETS.EXCELXP CLOSE;
    ODS LISTING;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  6. #6
    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 étudiant11 Voir le message
    C'est possible d'avoir le résultat avec la procédure compare?
    Bonjour,
    NON, cette procédure ne te sert à rien car il ne s’agit pas d’une comparaison entre deux tables. Il faudrait créer des enregistrements factices avec un tarif égal à zéro dans une table «base » puis dans une nouvelle étape data l’instruction UPDATE permet de modifier tout ou partie des valeurs des colonnes de la table résultante de la concaténation (table1 et table2). Voici le code qui te permet de réaliser la table attendue :
    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
    64
    65
    66
    67
    68
    69
     
    proc format ;
    value $ moiss
    '1'='Janvier'
    '2'='Fevrier'
    '3'='Mars';
    run;
     
    data table1;
    input variete $marque $ mois $ tarif ;
    cards;
    chocolat choco14 1 140
    chocolat choco14 2 250
    ; run;	   
     
    data table2;
    input variete $ marque $ mois $ tarif ;
    cards;
    chocolat choco15 1 140
    biscuit bg15 1 152
    biscuit bg15 1 152
    chocolat choco15 2 250
    biscuit bs15 2 150
    biscuit bs15 3 148
    ; run;	   
     
    data concat;
    set table2 table1;
    run;	   
     
    proc summary data=concat nway;
    class variete marque mois ;
    var tarif;
    output out=Summary_concat(drop=_type_ _freq_)  sum=;
    run;	   
     
    proc sort data=Summary_concat ; 
    by variete marque mois; 
    run ;
     
    /* création des enregistrements factices avec un tarif nul */
    data base (drop=an bisc) ;
    do variete='chocolat', 'biscuit' ;
    do an=14 to 15 by 1 ;
    do mois='1', '2', '3' ;
    tarif=0 ;
    if      variete='chocolat' then do ; marque=cats('choco', an) ; output ; end ;
    else if variete='biscuit'  then do bisc='bg', 'bs'; 
                                         marque=cats(bisc, an) ; output ; 
                                  end ;
    end ;
    end ;
    end ;
    run ;	  
     
    proc sort data=base ; by variete marque mois; run ;
     
    data update_Summary_concat ;
    update base Summary_concat ;
    by variete marque mois ;
    format mois  $moiss.; 
    run;    
     
    proc tabulate data= update_Summary_concat S=[FOREGROUND=BLACK CELLWIDTH=200 JUST=C];
    class variete mois marque;
    classlev marque /s=[CELLWIDTH=100];
    var tarif;
    table variete=''*marque='', mois=''*tarif=''*sum='' all=''*tarif='Total'*sum=''/  box={label='marque'  s=[ JUST=R ]}  rts=25   ;
    run;
    Ward

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut
    Merci pour vos réponses mais ça peut fonctionner seulement avec des petites bases , par contre ce que j'ai c'est une grande base avec des milliers de marques. Est ce que y a un autre moyen pour le faire sans spécifier à chaque fois les noms de marques?

  8. #8
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    data table1;
    input variete $marque $ mois $ tarif ;
     
    cards;
    chocolat choco14 1 140
    chocolat choco14 2 250
    test ts14 2 250
     
    ;run;
     
    data table2;
    input variete $ marque $ mois $ tarif ;
     
    cards;
    chocolat choco15 1 140
    biscuit bg15 1 152
    biscuit bg15 1 152
    biscuit cs15 1 152
    biscuit dd15 2 152
    biscuit af15 1 152
    biscuit gb15 3 152
    chocolat choco15 2 250
    biscuit bs15 2 150
    biscuit bs15 3 148
    marque gs14 1 157
    marque2 aa14 2 157
     
    ;run;
     
    proc sort data=table1; by variete marque;run;
     
    proc sort data=table2; by variete marque;run;
     
     
    data table3;
    merge table1 table2 ;
    by variete marque;
    run;
     
    data table4 ;
    set table3;
    marque1=left(scan(marque,1,(compress(marque,,'A'))));
     
    run;
     
     
    data table5  ;
    set table4;
    do an=14 to 15 by 1 ;
    tarif=0 ;
    marque2=cats(marque1,an) ;output;
    end;
     
    run ;
     
    data table6;
    set table5 table4;
    if tarif =0  then marque = marque2;
    run;
     
     
     
    proc tabulate data= table6 S=[FOREGROUND=BLACK CELLWIDTH=200 JUST=C] missing;
    class variete mois marque;
    classlev marque /s=[CELLWIDTH=100];
    var tarif;
    table variete=''*marque='', mois=''*tarif=''*sum='' all=''*tarif='Total'*sum=''/  box={label='marque'  s=[ JUST=R ]}  rts=25   ;
    run;
     
     
    proc datasets lib=WORK;
    delete tab:;
    run;

    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut
    merci brahim, mais j'ai un petit souci au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    produit1=left(scan(produit,1,(compress(produit,,'A '))));
    En fait les noms de marques que j'ai dans ma base contiennent des espaces par exemple biscuit saida donc avec ce code il ne prend en considération que biscuit

  10. #10
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Voici la solution:
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    data table1;
    input variete $marque $ mois $ tarif ;
     
    cards;
    chocolat choco14 1 140
    chocolat choco14 2 250
    test ts14 2 250
     
    ;run;
     
     
    data table2;
    input variete $ marque $ mois $ tarif ;
     
    cards;
    chocolat choco15 1 140
    biscuit  bg15 1 152
    biscuit bg15 1 152
    biscuit cs15 1 152
    biscuit dd15 2 152
    biscuit af15 1 152
    biscuit gb15 3 152
    chocolat choco15 2 250
    biscuit bs15 2 150
    biscuit bs15 3 148
    marque gs14 1 157
    marque2 aa14 2 157
     ;run;
     
     DATA table2 ;
     length marque $20.;
       SET table2 end=fini ;
       output table2 ;
       IF fini then do ;
           variete="biscuit" ;
           marque="biscuit saida15" ;
    	   mois="1";tarif=122;
     
           output table2 ;
       end ;
    run ;
     
    proc sort data=table1; by variete marque;run;
     
    proc sort data=table2; by variete marque;run;
     
     
    data table3;
    merge table1 table2 ;
    by variete marque;
    run;
     
    data table4 ;
    set table2;
    marque1=left(scan(marque,1,(compress(compress(marque),,'A'))));
     
    run;
     
     
    data table5  ;
    set table4;
    do an=14 to 15 by 1 ;
    tarif=0 ;
    marque2=cats(marque1,an) ;output;
    end;
     
    run ;
     
    data table6;
    set table5 table4;
    if tarif =0  then marque = marque2;
    run;
     
     
     
    proc tabulate data= table6 S=[FOREGROUND=BLACK CELLWIDTH=200 JUST=C] missing;
    class variete mois marque;
    classlev marque /s=[CELLWIDTH=100];
    var tarif;
    table variete=''*marque='', mois=''*tarif=''*sum='' all=''*tarif='Total'*sum=''/  box={label='marque'  s=[ JUST=R ]}  rts=25   ;
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  11. #11
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 94
    Points : 101
    Points
    101
    Par défaut
    Je vous remercie pour vos réponses c'est bon Heureusement que vous êtes là

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

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. Comparaison de deux tableaux
    Par tibss dans le forum Excel
    Réponses: 1
    Dernier message: 06/05/2009, 21h30
  3. Comparaison de deux tableaux en VB6
    Par taille50 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/08/2007, 10h28
  4. Comparaison de deux tableaux
    Par solorac dans le forum Excel
    Réponses: 7
    Dernier message: 03/08/2007, 08h49
  5. Comparaison de deux tableaux
    Par siaoly dans le forum Langage
    Réponses: 5
    Dernier message: 27/06/2006, 19h40

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