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 :

Update avec un count sur une colonne de la meme table


Sujet :

SAS Base

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Update avec un count sur une colonne de la meme table
    Bonjour,

    Je souhaite ajouter une colonne à une table: cette colonne correspond à un compteur obtenu à partir d'une autre colonne de la même table.

    Méthode 1:
    Je fais une proc sql en créant une 2ème table avec mon compteur
    => ça marche mais je voudrais éviter d'avoir à créer une 2ème table.

    Code correspondant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    proc sql;
    	create table t2 as
    	select *,count(seq) as countseq
    	from t1
    	group by id;
    quit;


    Méthode 2:

    Je fais une proc sql create sur la table 1 qui existe déjà
    => ça marche mais j'obtiens un warning et c'est pas génial:
    WARNING: This CREATE TABLE statement recursively references the target table.
    A consequence of this is a possible data integrity problem.

    Code correspondant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    proc sql;
    	create table t1 as
    	select *,count(seq) as countseq
    	from t1
    	group by id;
    quit;


    Méthode 3:

    Je fais une proc sql alter table sur la table 1 qui existe déjà puis un update
    => le alter table fonctionne mais pas l'update:
    WARNING: A value expression of the SET clause references the data set being updated.
    ERROR: You cannot reopen WORK.T1.DATA for update access with member-level control because
    WORK.T1.DATA is in use by you in resource environment SQL.
    ERROR: PROC SQL could not undo this statement if an ERROR were to happen as it could not
    obtain exclusive access to the data set. This statement will not execute as the SQL
    option UNDO_POLICY=REQUIRED is in effect.

    Code correspondant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    proc sql;
    	alter table t1
    	add countseq integer format=3.;
    quit;
     
     
    proc sql; 
    	update t1 
    	set countseq = (select count(seq) from t1 group by id);
    quit;
    Merci de votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Je ne suis pas extremement familier avec l'update dans sql, mais pourquoi n'utilises-tu pas tout simplement un proc means/univariate, puis un merge/ left join?

    c'est pas le plus optimisé, mais le plus simple je dirais..


    manoutz

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    salut!

    merci pour ta réponse.

    le proc univariate je connais pas trop mais ça doit se trouver facilement sur internet.

    mais le truc c'est que je sais que c'est possible sous sas de faire un update donc j'aimerai apprendre. c'est souvent écrit que le sql c'est bien en termes de performances donc plus j'apprendrai mieux ce sera

  4. #4
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    pour la proc univariate (le comptage sera la le comptage des valeurs non manquantes..):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc univariate data=sashelp.demographics;
    	var CONT;
    	by CONT;
    	output out=temp n=NB;
    run;
    par contre je suis aussi preneur pour le update..

    ciao

    Manoutz

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Désolé de déterrer ce topic, mais je cherche exactement la même chose !

    Je veux créer une colonne et mettre dedans le résultat d'un count avec une proc sql.

    J'ai donc créé une nouvelle colonne avec alter table et add. Mais je n'arrive pas à remplir cette nouvelle colonne (avec un update je suppose).

    Merci de votre aide

  6. #6
    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.
    Parmi les solutions proposées au départ par deb_dev, il y avait celle-ci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql;
    	CREATE TABLE t1 AS
    	SELECT *,count(seq) AS countseq
    	FROM t1
    	GROUP BY id;
    quit;
    dont le seul inconvénient est de générer un WARNING. On peut l'éliminer avec une option au niveau de l'instruction PROC.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql UNDO_POLICY=NONE ;
    	CREATE TABLE t1 AS
    	SELECT *,count(seq) AS countseq
    	FROM t1
    	GROUP BY id;
    quit;
    Bon courage.
    Olivier
    Bon courage.
    Olivier

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2014, 10h15
  2. Update avec un controle sur une autre table
    Par Calvein dans le forum Requêtes
    Réponses: 0
    Dernier message: 19/06/2009, 18h50
  3. plusieurs COUNT sur une seule table avec conditions différentes
    Par dingoth dans le forum Administration
    Réponses: 9
    Dernier message: 20/12/2006, 10h13
  4. Réponses: 4
    Dernier message: 31/10/2006, 19h03
  5. Réponses: 12
    Dernier message: 12/06/2006, 14h29

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