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 :

Ajout de colonnes [SQL]


Sujet :

SAS Base

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 76
    Points
    76
    Par défaut Ajout de colonnes
    Bonjour,
    J'ai plusieurs tables dont je veux faire l'union
    Mais auparavant, je voudrais ajouter une colonne (ord) dans chacune des tables : dans la 1re colonne de la la tab1, il y aura le chiffre 1, dans la 1re colonne de la la tab2, il y aura le chiffre 2, etc...
    Nouveau dans SAS, j'ai utilisé le SQL d'Access...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create table tab1 as select 1 as ord, var1, var2  var3...
    from tab1 
    create table tab2 as select  2 as ord, var1, var2  sum(var3) ...
    from tab2 group by ...
    ...
    create table tab11 as select  11 as ord, var1, var2  sum(var3) ...
    from tab11 group by ...
    Jusqu'à la tab6 tout était OK, mais à partir de la tab7 le regroupement ne se faisait plus ? A noter que les chiffres dans 1 as ord se mettent en couleur verte... donc je n'ai pas compris ce que signifie pour SAS create table tab1 as select 1 as ord,

    J'ai laissé tomber cette solution et j'ai ajouté une colonne par alter table (puis update) mais le problème c'est que la colonne se met à la fin et non pas au début comme je le voudrais.
    Merci de vos avis

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par eric232 Voir le message
    Bonjour,
    Je constate que mon code n'est pas clair, je précise : je crée 11 table qui ont la même structure et souhaite les réunir
    Mais auparavant, je voudrais ajouter une colonne (ord) dans chacune des tables : dans la 1re colonne de la la tab1, il y aura le chiffre 1, dans la 1re colonne de la la tab2, il y aura le chiffre 2, etc...
    Nouveau dans SAS, j'ai utilisé le SQL d'Access...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create table tab1 as select 1 as ord, var1, var2,  var3...
    from tab1 ;
     
    create table tab2 as select  2 as ord, "" as var1, var2, ""' as var3 ... sum(varx) 
    from tab2 group by var2;
     
    create table tab3 as select  2 as ord, "" as var1, "" as var2, var3 ... sum(varx)  
    from tab3 group by var3;
    ...
    /*total*/
    create table tab11 as select  11 as ord, "" var1, "" var2, , ""' as var3, "" as   ...sum(varx) 
    from tab11 group by var11;
    Jusqu'à la tab6 tout était OK, mais à partir de la tab7 le regroupement ne se faisait plus ? A noter que les chiffres dans 1 as ord se mettent en couleur verte... donc je n'ai pas compris ce que signifie pour SAS create table tab1 as select 1 as ord,

    J'ai laissé tomber cette solution et j'ai ajouté une colonne par alter table (puis update) mais le problème c'est que la colonne se met à la fin et non pas au début comme je le voudrais.
    Merci de vos avis

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Si tu fais ton union dans une étape Data et non en SQL, avec l'instruction SET, tu peux récupérer à chaque observation le nom de la table dont elle provient. Ensuite un peu de magie avec la fonction COMPRESS (KD=Keep Digits) pour ne garder que les nombres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA union ;
      SET t1 t2 t3 INDSNAME=source ;
      ord = INPUT(COMPRESS(source,,"KD"),2.) ;
    RUN ;
    Bon courage.
    Olivier

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Bonjour.
    Si tu fais ton union dans une étape Data et non en SQL, avec l'instruction SET, tu peux récupérer à chaque observation le nom de la table dont elle provient. Ensuite un peu de magie avec la fonction COMPRESS (KD=Keep Digits) pour ne garder que les nombres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA union ;
      SET t1 t2 t3 INDSNAME=source ;
      ord = INPUT(COMPRESS(source,,"KD"),2.) ;
    RUN ;
    Bonjour Olivier,
    Absent du bureau durant le week-end
    Table WORK.TAB11_16 created, with 403 rows and 77 columns.
    Table WORK.TAB11_16GRPNIV created, with 126 rows and 77 columns.

    Voici ce que j'obtiens :
    There were 403 observations read from the data set WORK.TAB11_16.
    There were 126 observations read from the data set WORK.TAB11_16GRPNIV.
    NOTE: There were 126 observations read from the data set WORK.TAB11_16GRPNIV.
    NOTE: The data set WORK.UNION has 529 observations and 141 variables

    Je devrais avoir 77 colonnes... de plus, dans la colonne ord, il n'y a que des "11", au lieu de "1" et "2"

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Si tu as plus de variables que prévu, c'est qu'elles ne portent pas toutes le même nom dans toutes les tables. Tu parlais au départ de tables "identiques".
    Pour la variable ORD, elle ne contient pas que des 1 ou des 2. Elle contient le nom de la table d'où provient l'observation, où COMPRESS ne garde que les chiffres. S'il ne reste que "11", c'est sans doute pour une question de longueur de variable.
    Essaye ceci plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA union ;
      LENGTH source $ 41 ;
      SET t1 t2 t3 INDSNAME=source ;
      LENGTH table $ 32 ;
      table = SCAN(source,2,".") ;
    RUN ;
    Bon courage.
    Olivier

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Si tu as plus de variables que prévu, c'est qu'elles ne portent pas toutes le même nom dans toutes les tables. Tu parlais au départ de tables "identiques".
    Pour la variable ORD, elle ne contient pas que des 1 ou des 2. Elle contient le nom de la table d'où provient l'observation, où COMPRESS ne garde que les chiffres. S'il ne reste que "11", c'est sans doute pour une question de longueur de variable.
    Essaye ceci plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA union ;
      LENGTH source $ 41 ;
      SET t1 t2 t3 INDSNAME=source ;
      LENGTH table $ 32 ;
      table = SCAN(source,2,".") ;
    RUN ;
    Merci Olivier, je laisse tomber, j'ai trouvé entre temps une solution intermédiaire, faire un alter table et un update pour chaque table
    proc sql;
    alter table tab11_16Tout add NumOrd NUM(2);
    quit;
    proc sql;
    UPDATE tab11_16Tout SET NumOrd =11;
    quit;
    Comme le produit final est un tableau excel, je déplacerais à la main la dernière colonne
    oui, c'est un problème de variable car dans les regroupements les variables sont remplacés par du texte, du genre "tous codes confondus" ou tous niveaux confondus"

    Sinon, voici ce que ça a donné... avec le chiffre 11 ou un point dans la dernire colonne "ord" (TAB11_16 étant la table détaillée et TAB11_16TOUT le total, les autres étant les regroupements suivants les variables)
    WARNING: Plusieurs longueurs ont été spécifiées pour la variable CodeDipl par la ou les tables
    SAS d'entrée. Risque de troncature des données.
    NOTE: There were 403 observations read from the data set WORK.TAB11_16.
    NOTE: There were 126 observations read from the data set WORK.TAB11_16GRPNIV.
    NOTE: There were 119 observations read from the data set WORK.TAB11_16GRPTD.
    NOTE: There were 3651 observations read from the data set WORK.UNION.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16DOMNIV2.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16DOMNIV3.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16DOMTD2.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16DOMTD3.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16NIV.
    NOTE: There were 3 observations read from the data set WORK.TAB11_16TD.
    NOTE: There were 52 observations read from the data set WORK.TAB11_16GS.
    NOTE: There were 1 observations read from the data set WORK.TAB11_16TOUT.
    NOTE: The data set WORK.UNION has 4370 observations and 143 variables.

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

Discussions similaires

  1. [JTable] ajouter une colonne de checkbox
    Par nawel dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2005, 14h07
  2. [ADO.Net][VB.NET] Comment ajouter une colonne Integer à un DataTable ?
    Par graphicsxp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/04/2005, 12h08
  3. [C#] Ajout de colonne dans un DataGrid
    Par pc152 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/09/2004, 17h17
  4. ajout de colonnes sur une selection
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/08/2004, 17h44

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