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 :

jointure sur deux table


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut jointure sur deux table
    bonjour

    Je ne sais pas si je vais me faire comprendre parceque c"est assez difficile à
    expliquer.

    Tout d'abord j'ai créés deux table l'un prenant les 3 meilleur libelle par libelle selon leu date
    et j'ai fais la même chose selon leur fréquence

    exemple table par rapport a la date
    libelle date freq top3date
    tata 200701 12 3
    tata 200501 18 2
    tata 200201 2 1

    exemple table par rapport a la frequence
    libelle date freq top3date
    tata 200701 12 1
    tata 200501 18 2
    tata 200001 20 3

    parce que si je fais ceci c'est pour ensuite leur donnée une note en aditionnant les top3 date et les top3 freq

    Donc voici la table que je souhaiterait
    libelle date freq top3date top3freq note
    tata 200701 12 3 1 4
    tata 200501 18 2 2 4
    tata 200001 20 0 3 3
    tata 200201 20 1 0 1

    J'ai éssayer un merge mais il me fait la jointure ligne par ligne
    Si je n'est pas été compris je peux réexpliquer

  2. #2
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Pour faire les jointures que tu veux tu peux utiliser une proc SQL avec l'option join.
    Par contre pour créer ton score en passant par une étape data tu devrais pouvoir l'obtenir assez facilement.
    Les balises code
    FAQ SAS
    Rubrique SAS

    Si vous souhaitez contribuer à la rubrique SAS, contactez-moi ou tout autre membre de l'équipe BI par MP.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut
    c'est pas tellement ce que je veux parceque moi je veu passer par une étape data parceque c'est a partir de la table que je veut travailler et non celle de la proc sql

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    bonjour,

    pour avoir tes lignes tu peux utiliser ce code.

    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
     
    data temp1; 
      libelle="tata"; date=200701 ; freq=12 ; top3dateA=3 ; output;
      libelle="tata"; date=200501 ; freq=18 ; top3dateA=2 ; output;
      libelle="tata"; date=200201 ; freq=2 ; top3dateA=1 ; output;
    run;
     
    data temp2; 
      libelle="tata"; date=200701 ; freq=12 ; top3dateB=1 ; output;
      libelle="tata"; date=200501 ; freq=18 ; top3dateB=2 ; output;
      libelle="tata"; date=200001 ; freq=20 ; top3dateB=3 ; output;
    run;
     
    proc sort data=temp1; by libelle date; run;
    proc sort data=temp2; by libelle date; run;
     
     
    data resultat;
      merge temp1 (in=a)
            temp2 (in=b);
      by libelle date;
      if (a) then do;
         if (b) then do;
             somme=top3dateA+top3dateB;
          end;
    	  else do;
    	     top3dateB=0;
    	     somme=top3dateA;
    	  end;
      end;
      else do;
        top3dateA=0;
        somme=top3dateB;
      end;
    run;
    j'espère que c'est ce que tu veux faire.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut
    je vois ce que tu veu faire mais le probéme c'est que j'ai 1600 ligne soit environ 700 libelle différent parceque un libelle peut être présent 1 fois ou 10 fois ,moi au maximum je veux en récupérer 6 , 3 libellé par rapport a la date
    et 3 libelle selon leur frequentaion

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    re-,

    j'avoue ne pas comprendre ce que tu veux faire.
    si j'ai bien compris:
    tu as constitué une table A contenant pour chaque libellé les 3 dates les plus récentes (donc si j'ai 10 libellés différents, j'aurai 30 lignes dans la table)

    tu as constitué une table B contenant pour chaque libellé les 3 fréquences les les plus importantes (même raisonnement 10 libellés = 30 lignes)

    Donc si tu as déjà fait la sélection des 3 meilleurs résultats par fréquence et date dans ces tables, le merge te retournera au maximum 6 lignes par libellés (si aucune date ne correspond entre la table A et la table B)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut
    oui c'est ce que j'ai mais le probéme exemple

    selon la date : table A

    num nom date freq top
    1 tata 200701 20 3
    2 tata 200501 10 2
    3 tata 200301 5 1

    selon la freq : table B

    num nom date freq top
    1 tata 200701 20 3
    2 tata 200501 15 2
    4 tata 199901 9 1

    pour cette exemple il doit pas m'afficher 3 ligne mais 4 ligne
    table C

    1 tata 200701 20 3 3
    2 tata 200501 10 2 2
    3 tata 200301 5 1 0
    4 tata 199901 9 0 1

    donc pour cette exemple le merge ne marche pas

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    je suis désolée je ne comprends vraiment pas.

    lorsque je prends tes valeurs et le programme, j'obtiens bien 4 lignes

    j'ai lancé ce programme avec tes données de test:

    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 temp1; 
      libelle="tata"; date=200701 ; freq=20 ; top3dateA=3 ; output;
      libelle="tata"; date=200501 ; freq=10 ; top3dateA=2 ; output;
      libelle="tata"; date=200301 ; freq=5 ; top3dateA=1 ; output;
    run;
    proc print; run;
    data temp2; 
      libelle="tata"; date=200701 ; freq=20 ; top3dateB=3 ; output;
      libelle="tata"; date=200501 ; freq=15; top3dateB=2 ; output;
      libelle="tata"; date=199901 ; freq=9 ; top3dateB=1 ; output;
    run;
    proc print; run;
    proc sort data=temp1; by libelle date; run;
    proc sort data=temp2; by libelle date; run;
    data resultat;
      merge temp1 (in=a)
            temp2 (in=b);
      by libelle date;
      if (a) then do;
         if (b) then do;
             somme=top3dateA+top3dateB;
          end;
    	  else do;
    	     top3dateB=0;
    	     somme=top3dateA;
    	  end;
      end;
      else do;
        top3dateA=0;
        somme=top3dateB;
      end;
    run;
    proc print; run;
    et voila les sorties que j'obtiens:
    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
     
    Table temp1:
                                                                    top3date
                           Obs    libelle     date     freq        A
     
                            1      tata      200701     20         3
                            2      tata      200501     10         2
                            3      tata      200301      5         1
     
    table temp2:
                                                              top3date
                           Obs    libelle     date     freq        B
     
                            1      tata      200701     20         3
                            2      tata      200501     15         2
                            3      tata      199901      9         1
     
    table resultat:
                                                     top3date    top3date
                 Obs    libelle     date     freq        A           B       somme
     
                  1      tata      199901      9         0           1         1
                  2      tata      200301      5         1           0         1
                  3      tata      200501     15         2           2         4
                  4      tata      200701     20         3           3         6
    peux tu me montrer dans ces résultats où se trouve ton erreur?

  9. #9
    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
    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
     
    data toto1;
    format nom $10.;
    input num nom $ date freq top;
    cards;
    1 tata 200701 20 3
    2 tata 200501 10 2
    3 tata 200301 5 1
    ;
    run;
     
    data toto2;
    format nom $10.;
    input num nom $ date freq top;
    cards;
    1 tata 200701 20 3
    2 tata 200501 15 2
    4 tata 199901 9 1
    ;
    run;
     
    proc sort data=toto1; by num nom;run;
    proc sort data=toto2 out=toto2_tr(rename=(freq=freq2 top=top2)); by num nom;run;
    data fus/*(keep=num nom date freq_fin top_fin)*/; merge toto1 (in=a) toto2_tr(in=b);
    by num nom;
    /*freq_fin=max(freq,freq2);
    top_fin=max(top,top2);*/
    if freq =. then freq=0;
    if freq2 =. then freq2=0;
    if top =. then top=0;
    if top2 =. then top2=0;
    run;
     
     
    data toto1;
    format nom $10.;
    input num nom $ date freq top;
    cards;
    1 tata 200701 20 3
    2 tata 200501 10 2
    3 tata 200301 5 1
    ;
    run;
     
    data toto2;
    format nom $10.;
    input num nom $ date freq top;
    cards;
    1 tata 200701 20 3
    2 tata 200501 15 2
    4 tata 199901 9 1
    ;
    run;
     
    proc sort data=toto1; by num nom;run;
    proc sort data=toto2 out=toto2_tr(rename=(freq=freq2 top=top2)); by num nom;run;
    data fus/*(keep=num nom date freq_fin top_fin)*/; merge toto1 (in=a) toto2_tr(in=b);
    by num nom;
    /*freq_fin=max(freq,freq2);
    top_fin=max(top,top2);*/
    if freq =. then freq=0;
    if freq2 =. then freq2=0;
    if top =. then top=0;
    if top2 =. then top2=0;
    run;
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut
    je crois que c'est bon ,c'estmoi qui me sui tromper dans le code que tu mas passer
    mais je verifi les résultat pour voir est ce que tou co incide et je te confirme
    merci

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 167
    Points : 66
    Points
    66
    Par défaut
    c'est bon j'ai verifié tout est ok
    J'ai galéré a me faire comprendre mais on a trouvé
    merci

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

Discussions similaires

  1. Jointure sur deux tables de schema differents
    Par tatayet_le_felee dans le forum SQL
    Réponses: 4
    Dernier message: 24/03/2009, 10h40
  2. une non equi-jointure sur deux tables
    Par AliJava dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/06/2008, 15h26
  3. [Requête] Jointure sur deux tables.
    Par Invité dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/11/2007, 11h36
  4. Jointure sur deux tables
    Par shinji_rem dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/04/2007, 10h18
  5. Jointures sur deux tables
    Par spirou dans le forum Requêtes
    Réponses: 6
    Dernier message: 31/05/2006, 15h46

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