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 :

Création de tables


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Création de tables
    Bonjour,
    Je sollicite votre aide. Je galère depuis un moment pour optimiser le programme ci dessous. Pourriez vous m'apporter votre aide svp?
    En fait j'ai plusieurs union all (plus de 50 tables) à faire et j'aimerai faire en une fois voir peu (avec une boucle ou autres etc...). Je pense que tout repose sur Base1, Base2 etc... mais comme je suis très débutant j'en sais pas trop. Merci beaucoup

    Liste Base
    Base1
    Base2
    Base3
    Base4
    Etc---

    programme:
    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
    proc sql;
    create Table Complete as (
    select    A.DATABASE,
           A.name as Nom_TBL,
                    A.attname as COLONNE    
    from      Base1.._v_relation A
    where  A.type = 'TABLE'
    union all
    select    A.DATABASE,
           A.name as Nom_TBL,
                    A.attname as COLONNE    
    from      Base2.._v_relation A
    where  A.type = 'TABLE'
    union all
    select    A.DATABASE,
           A.name as Nom_TBL,
                    A.attname as COLONNE    
    from      Base3.._v_relation A
    where  A.type = 'TABLE'
    union all
    select    A.DATABASE,
           A.name as Nom_TBL,
                    A.attname as COLONNE    
    from      Base4.._v_relation A
    where  A.type = 'TABLE'
    union all
    select    A.DATABASE,
           A.name as Nom_TBL,
                    A.attname as COLONNE    
    from      Base4.._v_relation A
    where  A.type = 'TABLE'
    union all
    ...
    ...
    );
    quit;
    je reste dispo. Merci vraiment.

    Cordialement,
    MamsT

  2. #2
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Avez-vous des doublons entre vos tables?


    (J'imagine que non ou du moins que vous souhaitez les conserver vu l'usage d'un UNION ALL).


    Une solution simple à votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /* on met la liste des tables en macro-variable */
    %let liste_table = 
    base1
    base2
    base...;
     
     
    data complete;
    set &liste_table.;
    run;

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JQuem Voir le message
    Bonjour,

    Avez-vous des doublons entre vos tables?
    Bonjour,
    Oui dans la liste des bases, il peut y avoir des doublons (genre base1, base1,..) mais je veux la récupèrer une seule fois. mais concernant les select, je fais pas de distinct.
    je sais pas si je suis assez clair?

    CDT,
    MamsT

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JQuem Voir le message
    Bonjour,

    Avez-vous des doublons entre vos tables?


    (J'imagine que non ou du moins que vous souhaitez les conserver vu l'usage d'un UNION ALL).


    Une solution simple à votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /* on met la liste des tables en macro-variable */
    %let liste_table = 
    base1
    base2
    base...;
     
     
    data complete;
    set &liste_table.;
    run;
    En fait la liste des bases se trouvent dans un tableau, je dois faire appel à cette liste pour utiliser à chaque fois une ligne (sans doublons côté base) dans mon premier select et ensuite 2ème select dans mon deuxième select avec un union all etc.... Je dois également optimiser le union all pour éviter d'écrire plus de 50 fois. Du coup ce set ne marchera.
    Parcequ'en fait les bases sont reliées a une table system où je récupère la structure de mes bases, il faut bien analyser le select pour comprendre en fait. Merci pour ton aide.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    En fait la liste des bases se trouvent dans un tableau, je dois faire appel à cette liste pour utiliser à chaque fois une ligne (sans doublons côté base) dans mon premier select et ensuite 2ème select
    jusque là je vous suis

    dans mon deuxième select avec un union all etc.... Du coup ce set ne marchera.
    Parcequ'en fait les bases sont reliées a une table system où je récupère la structure de mes bases, il faut bien analyser le select pour comprendre en fait.
    Là mystère, je n'ai rien compris. Pouvez expliquer plus clairement ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JQuem Voir le message
    jusque là je vous suis



    Là mystère, je n'ai rien compris. Pouvez expliquer plus clairement ?
    En fait, chaque select correspond à une ligne référencée dans la liste base, et je les relie grace à un union all. De ce fait j'aimerai faire en un bloc ces differents select afin d'optimiser mon programme.
    Si vous voulez les bases sont des BDD (où j'ai plusieurs tables, chaque table contient plusieurs colonnes), donc pour récupérer la structure de la BDD (liste base), je fais appel à la table système où j'ai le nom de la BDD, nom des tables, nom des colonnes (je prends que les 3 dans mon select). pour info, la table system ici est _V_relation.

  7. #7
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Ok.

    Donc si je vous suis bien, on pourrait extraire la liste des tables depuis votre base systeme.

    Puis se servir de cette liste pour agréger l'ensemble des tables de cette liste (étant entendu que ces tables sont dans des bases (ou plutôt librairies) différentes).

  8. #8
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JQuem Voir le message
    Ok.

    Donc si je vous suis bien, on pourrait extraire la liste des tables depuis votre base systeme.

    Puis se servir de cette liste pour agréger l'ensemble des tables de cette liste (étant entendu que ces tables sont dans des bases (ou plutôt librairies) différentes).
    Oui voilà c'est bien cela.

  9. #9
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Ok.

    Imaginons que votre base systeme se nomme INFO_SYSTEME.
    Que cette base contienne les colonnes LIBRARY et TABLE. La colonne LIBRARY désigne la librairie dans la laquelle se trouve la table et TABLE le nom de la table.

    On veut obtenir une liste de ce genre :

    LIBRARY1.TABLE1 LIBRARY2.TABLE2 etc...

    Car si l'on met cette liste dans l'instruction SET d'un datastep, SAS va tout simplement agréger l'ensemble des tables de cette liste.

    Pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data _null_;
    set INFO_SYSTEM;
    call symputx('liste_table',symget('liste_table')||' '||LIBRARY||'.'||TABLE);
    run;
    Dans ce code, on a créer une macro-variable nommée 'liste_table' qui contient la liste des tables que l'on veut agréger.


    Il n'y a plus qu'à appeler cette liste dans une instruction SET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data complete;
       set &liste_table.;
    run;

  10. #10
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JQuem Voir le message
    Ok.

    Imaginons que votre base systeme se nomme INFO_SYSTEME.
    Que cette base contienne les colonnes LIBRARY et TABLE. La colonne LIBRARY désigne la librairie dans la laquelle se trouve la table et TABLE le nom de la table.

    On veut obtenir une liste de ce genre :

    LIBRARY1.TABLE1 LIBRARY2.TABLE2 etc...

    Car si l'on met cette liste dans l'instruction SET d'un datastep, SAS va tout simplement agréger l'ensemble des tables de cette liste.

    Pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data _null_;
    set INFO_SYSTEM;
    call symputx('liste_table',symget('liste_table')||' '||LIBRARY||'.'||TABLE);
    run;
    Dans ce code, on a créer une macro-variable nommée 'liste_table' qui contient la liste des tables que l'on veut agréger.


    Il n'y a plus qu'à appeler cette liste dans une instruction SET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data complete;
       set &liste_table.;
    run;
    Ok je vais essayer la solution et je vous tiens au courant.
    Merci beaucoup

  11. #11
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Bon courage !

Discussions similaires

  1. [Macro] optimisation de programmes SAS
    Par bar_79 dans le forum Macro
    Réponses: 4
    Dernier message: 25/11/2008, 15h51
  2. Lancement d'un programme SAS en batch
    Par benoitbrisefer dans le forum Administration et Installation
    Réponses: 1
    Dernier message: 22/07/2008, 17h54
  3. Optimisation programmation Interface
    Par christophe_halgand dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 28/02/2008, 18h49
  4. Optimisation programme ::
    Par scolopendra dans le forum Langage
    Réponses: 5
    Dernier message: 16/04/2007, 17h53
  5. Optimiser programme (D7)
    Par mario9 dans le forum Delphi
    Réponses: 2
    Dernier message: 18/08/2006, 17h36

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