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 :

Comment créer une table avec une ligne pour chaque individu [DATA]


Sujet :

SAS Base

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

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Points : 40
    Points
    40
    Par défaut Comment créer une table avec une ligne pour chaque individu
    Bonjour j'ai une table (plusieurs lignes par identifiant) la dateDebut étant la unique pour chaque identifiant:

    Identifiant DateDebut DateEnregistrement Prix
    65428917 201008 201011 50
    65428917 201008 201301 100
    65428917 201008 201101 60
    92823734 200901 200906 10
    92823734 200901 200907 200

    J'aimerai obtenir la table suivante (avec une seule ligne par identifiant):

    Identifiant DateDebut SommePrix
    65428917 201008 110
    92823734 200901 210

    Explication:
    Pour l'identifiant 65428917, je n'additionne que les prix si DateEnregistrement c'est au plus tard 9 mois après DateDebut. Donc pour cet identifiant 50+60.

    Avec un proc tabulate ca peut marcher mais c très long comme j'ai beaucoup de données et ca me donne les résultats en sortie or moi je veux créer une nouvelle table que je peux utiliser.



    Merci pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Une piste, si ton code de proc tabulate est déjà prêt : tu peux créer une table en sortie d'une proc tabulate, avec un très classique "out ="

  3. #3
    Membre régulier
    Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2013
    Messages : 27
    Points : 76
    Points
    76
    Par défaut
    Si la tabulate avec le out est trop long.
    Voici une autre solution avec un retains.
    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
    data t1;
    	input id dateDeb dateFin var1 10.;
    	datalines;
    1 201008 201011 50
    1 201008 201301 100
    1 201008 201103 90
    1 201008 201101 60
    2 200901 200910 10
    2 200902 200907 200
    3 201201 201205 40
    3 201201 201208 10
    3 201201 201511 85
    3 201201 201202 15
    4 201508 201602 800
    5 201405 201412 400
    6 200109 200110 125
    6 200109 200111 125
    6 200109 201001 1200
    ;run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA t2(DROP=var1 dateFin);
    	SET t1;
    	BY id;
    	IF dateFin-dateDeb>270 OR dateFin-dateDeb<0 then var1=0;
    	retain somme;
    	if first.id then somme=0;
    		somme=somme+var1;
    	if last.id then output;
    run;

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour,

    Tu peux aussi passer par une proc sql comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    proc sql;
    create table truc as
    select distinct identifiant, dateDebut, sum(prix) as SommePrix
    from essai
    where dateFin-dateDebut<=270
    group by identifiant;
    quit;

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

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos réponses.


    La variable DateFin est en fait en format date SAS (du style 28SEPT2008 00:00:00)
    la variable dateDébut elle est bien du type yyyymm (201202)
    et je 'arrive pas à modifier vos codes pour calculer donc quand
    DateFin-DateDébut < 9 Mois.

    Dernière chose j'ai une variable en plus appelé code (ou j'ai 30, 71, 80 ou 94)
    un même identifiant n'a pas toujours le même code sur toutes les lignes
    et j'aimerai créer une autre variable Etat (comme sum(prix)) ou cette fois ci:
    si le chiffre 71 ou 94 est présent au moins une fois pour un identifiant au plus tard 9 Mois après DateDébut alors defectueux sinon EnbonneEtat.

    exemple:
    id dateDeb dateFin var1 code

    1 201008 201011 50 30
    1 201008 201301 100 71
    1 201008 201103 90 80
    1 201008 201101 60 30
    2 200901 200910 10 30
    2 200902 200907 200 94

    Pour l'identifiant 2 Etat doit être égale à defectueux car on a le 94 cinq Mois après datedeb
    Pour l'identiant 1 Etat doit valoir EnbonneEtat car on le 71 en Janvier 2013 (dateFin) c'est à dire plus de 9 Mois après Aout 2010 (DaetDeb).

    Merci encore pour votre aide

  6. #6
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    Février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    Pour la 1ère question, il faut utiliser la procédure SUMMARY ou MEANS.
    Par exemple :

    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
    data data1;
    informat DateDebut DateEnregistrement yymmdd8. ;
    format DateDebut DateEnregistrement ddmmyy10. ;
     
    input Identifiant $ DateDebut DateEnregistrement Prix ;
    cards ;
    65428917 20100801 20101101 50
    65428917 20100801 20130101 100 
    65428917 20100801 20110101 60
    92823734 20090101 20090601 10
    92823734 20090101 20090701 200
    ;
    run ;
     
    proc summary data=data1 nway ;
    class Identifiant DateDebut ;
    var Prix ;
    where INTCK('MONTH', DateDebut,DateEnregistrement) le 9 ;
    output out=data2 (drop=_type_ _freq_) sum= ;
    quit;
    Je n'ai pas trouvé d'informat pour la forme yyyymm de la date, mais vous pouvez facilement recréer une date SAS avec la fonction MDY.


    Cordialement,
    Géraldine Cade-Deschamps
    Support Clients SAS
    Cordialement,

    --
    Géraldine CADE-DESCHAMPS
    Consultante ▪ Support Clients SAS
    Tel: +33 1 60 62 12 12 ▪ support@sas.com
    www.sas.com/france
    SAS® … THE POWER TO KNOW®

  7. #7
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    yymmn6. pour les dates au format YYYYMM

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos réponses La PROC SUMMARY est de loin la méthode la plus rapide quand on a beuacoup de data

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 17h10
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 11h17
  3. [MySQL] requete dans une table avec une varible d'une autre table
    Par kogoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/11/2011, 16h24
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 15h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 22h50

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