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

Macro Discussion :

[Macro] Calcul de pourcentage sur table


Sujet :

Macro

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [Macro] Calcul de pourcentage sur table
    Bonjour,

    par une proc SQL, j'ai obtenu 2 tables avec:
    table1: un nombre d'observaion X1 et un montant Y1.
    table2: un nombre d'observation X2 et un montant Y2.

    je souhaiterai calculer les % X1/X2 et Y1/Y2.

    y'a t-il moyen de faire ça sous sas9 ou guide.

    merci.

    Ines

  2. #2
    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
     
    data t1;
    x1=8; y1=8;
    run;
    data t2;
    x2=4; y2=4;
    run;
    data t; set t1; set t2; 
    x=x1/x2;
    y=y1/y2;
    run;

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    merci pour vos retours.
    Je ne pourrais pas procéder ainsi, car les X et Y sont aussi des veleurs calculés à chaque fois.

    Je souhaiterai automatiser le script en n'ayant pas à chaque fois à saisir les valeurs obtenues pour les X et Y tel que c'est dans l'exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create table A as
    select sum(Y) as Y1 ,count(*) as X1 from base B;
    quit;
    select sum(Y) as Y2 ,count(*) as X2 from base C;
    quit;


    ensuite je veux calculer Y1/Y2 et X1/X2.

    d'avance merci pour votre aide.

    Ines.

  4. #4
    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
    Si ta table T1 et T2 (de mon exemple) existe, je ne vois pas le problème.
    Est ce que T1 et T2 contiennent le même nombre d'obs? et les mêmes noms et nombre de variables?
    Si oui => c'est ça ce qui te manques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA t; SET t1; SET t2; 
    x=x1/x2;
    y=y1/y2;
    run;

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Tout est faisable avec du SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    proc sql;
    create table TEMP as
    	select a.NB / b.NB as NB_RATIO, a.VAR / b.VAR as VAR_RATIO
    	from
    (select count(*) as NB, sum(variable) as VAR
    from SOURCE) a
    	inner join
    (select count(*) as NB, sum(variable) as VAR
    from SOURCE1) b
    		on 1 = 1
    ;
    quit;
    Par contre il est vrai que SQL n'est pas fait pour. Je ferais ces calculs plutôt en faisant deux proc sql avec des clauses into pour charger les valeurs dans les variables macro pour les réutiliser après.

  6. #6
    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
    Bonjour,

    C'est quoi
    On 1=1
    ?? jamais vu!!!!

    Merci

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Ça s'appelle du bidouillage :-)
    Comme tu as pu constater, le SQL du SAS est assez différent du standard SQL. Parmi les petites particularités que j'ai trouvées cette obligation d'avoir la clause "on" pour chaque "join". Or ici j'en ai pas besoin, je veux faire un produit cartésien tout simple et garder tous les enregistrements. Donc dans la clause "on" il faut mettre un truisme, "1=1", "2*2=4", "1>0", etc.

  8. #8
    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 : 47
    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
    @ Green :
    pour le produit cartésien, utilise une virgule au lieu du INNER JOIN, ça évitera ce genre de bidouilles avec ON (mais il y aura un Warning dans la Log, je le concède).

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre réponse.
    merci aussi pour ces infos enrichissantes sur le produit cartésien.

    bonne journée à tous.

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Merci :-) Mais je préfère des programme zero-warning pour bien voir s'il se passe qqch d'anormal.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/04/2015, 15h44
  2. [TCD] [E-03] Calcul de pourcentages sur sous-totaux
    Par coyote égaré dans le forum Excel
    Réponses: 5
    Dernier message: 06/11/2013, 21h24
  3. [2.3.0] Calcul de pourcentage sur un crosstab
    Par scariou29 dans le forum BIRT
    Réponses: 0
    Dernier message: 31/12/2008, 16h06
  4. calculer un pourcentage sur un bloc de variables
    Par nostress dans le forum SAS Base
    Réponses: 2
    Dernier message: 09/07/2008, 14h12
  5. Mise à jour champs par calcul sur table jointe
    Par SylvainM dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/03/2008, 17h38

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