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 :

Insérer des lignes dans une table


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 24
    Points : 23
    Points
    23
    Par défaut Insérer des lignes dans une table
    bonjour tout le monde,

    Actuellement, j'ai une table comme suit : (extrait de ma base de 3millions d'enregistrements)
    ANNEE1 ANNEE2 SOCIETE 1 SOCIETE 2 MONTANT1 MONTANT2 ECART
    2001 2001 X X 7649.71 7273.35 0
    2002 2001 X X 7649.71 7245.35 1
    2003 2001 X X 7649.71 7328.31 2
    2007 2001 X X 7621.71 7447.91 6
    2008 2001 X X 8359.19 8359.19 7
    2009 2001 X X 8359.19 8359.19 8


    l'idée est de compléter la table de telle manière à avoir dans la variable ANNEE1 (2001 à 2012) et la variable ECART -qui est la différence entre les variables ANNEE1 et ANNEE2- varie de (0 à 11)
    pour les lignes insérées on garde les mêmes valeurs de la ligne précédente.

    la table de sortie doit être comme suit :

    ANNEE1 ANNEE2 SOCIETE 1 SOCIETE 2 MONTANT1 MONTANT2 ECART
    2001 2001 X X 7649.71 7273.35 0
    2002 2001 X X 7649.71 7245.35 1
    2003 2001 X X 7649.71 7328.31 2
    2004 2001 X X 7649.71 7328.31 3
    2005 2001 X X 7649.71 7328.31 4
    2006 2001 X X 7649.71 7328.31 5
    2007 2001 X X 7621.71 7447.91 6
    2008 2001 X X 8359.19 8359.19 7
    2009 2001 X X 8359.19 8359.19 8
    2010 2001 X X 8359.19 8359.19 9
    2011 2001 X X 8359.19 8359.19 10
    2012 2001 X X 8359.19 8359.19 11

    Je vous remercie pour votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Dans ta table, quelle est la variable qui permet de repérer le début d'un bloc ?
    J'ai pris comme hypothèse que c'est la variable Societe_1 pour créer ce code exemple (la table est triée par societe_1 et Annee1 également) :

    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
    Data pr;
    input ANNEE1 ANNEE2 SOCIETE_1 $ SOCIETE_2 $ MONTANT1 MONTANT2 ECART ;
    cards;
     2001 2001 X X 7649.71 7273.35 0
     2002 2001 X X 7649.71 7245.35 1
     2003 2001 X X 7649.71 7328.31 2
     2007 2001 X X 7621.71 7447.91 6
     2008 2001 X X 8359.19 8359.19 7
     2009 2001 X X 8359.19 8359.19 8
     2001 2001 Y Y 7649.71 7273.35 0
     2002 2001 Y Y 7649.71 7245.35 1
     2003 2001 Y Y 7649.71 7328.31 2
    ;run;
     
    Data pr2;
    Set pr;
    By Societe_1;
    Output;
    If last.societe_1 then do While (ANNEE1 < 2012);
    	Annee1 = Annee1 + 1;
    	Ecart = Annee1 - Annee2;
    	Output;
    End;
    run;
    j'ai ajouté 3 nouvelles lignes pour d'autres sociétés.

    Merci de préciser ta demande si ce n'est pas ce que tu attends.

    Flo00154

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    bonjour,

    merci pour votre retour, en effet c'est la variable Societe1 qui permet d'avoir les blocs.

    le code que vous m'avez fourni réponds partiellement à ma demande car il ne fait que compléter la fin (par exemple si pour un bloc ma dernière date est 2009 il complète jusqu'à 2012) mais il complète pas la base au milieu ni au début (si mon bloc commence à 2003 il ne me crée pas les lignes 2001 et 2002 et si au milieu j'ai 2005 puis 2007 il ne me crée pas la ligne de 2006).

    j'attends votre retour car je suis à court d'idée.

    je vous remercie bcp.

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Ok je n'avais pas compris ce point.
    Si la première année c'est 2003 par exemple il faut répliquer les valeurs de 2003 sur 2002 et 2001 ?

    Un code qui permet de répondre à la question :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Data pr;
    input ANNEE1 ANNEE2 SOCIETE_1 $ SOCIETE_2 $ MONTANT1 MONTANT2 ECART ;
    cards;
     2001 2001 X X 7649.71 7273.35 0
     2002 2001 X X 7649.71 7245.35 1
     2003 2001 X X 7649.71 7328.31 2
     2007 2001 X X 7621.71 7447.91 6
     2008 2001 X X 8359.19 8359.19 7
     2009 2001 X X 8359.19 8359.19 8
     2001 2001 Y Y 7649.71 7273.35 0
     2002 2001 Y Y 7649.71 7245.35 1
     2003 2001 Y Y 7649.71 7328.31 2
     2003 2001 Z Z 7649.71 7328.31 2
     2007 2001 Z Z 7621.71 7447.91 6
    ;run;
     
    data fmt;
    length start $40 label $200 fmtname $32;
    retain fmtname '$Societe';
    set pr end=last;
    Start = CATS(Societe_1,ANNEE1);
    Label = CATX("/",ANNEE1,Montant1,Montant2);
    Output;
    If last then do;
    	hlo = 'O';
    	Label = "";
    	Output; 
    End;
    run;
     
    proc format cntlin=fmt;
    run;
     
    Data pr2 (keep = ann: soci: mont: ecart);
    Set pr;
    By Societe_1;
    length an $ 60 data $ 60 rev $ 1;
    Retain an;
    If first.societe_1 then	an = put(ANNEE1,4.);
    Else an = catx(',',an,Annee1);
    Output;
    If last.societe_1 then do i = 2001 to 2012;
    	p = 0;
    	cpt = 0;
    	call missing (rev,data);
    	If find(an,put(i,4.)) = 0 and i ne 2001 then do until(missing(data)=0);
    		cpt + 1;
    		p + 1;
    		Data = IFC(Rev ne "+",put(CATS(Societe_1,i - p),$societe.),put(CATS(Societe_1,i + p),$societe.));
    		If i - p = 2000 then do;
    			p = 0;
    			rev = "+";
    		End;
    		If missing(data) = 0 then do;
    			Annee1 = i;
    			Montant1 = scan(data,2,"/") * 1;
    			Montant2 = scan(data,3,"/") * 1;
    			Ecart = Annee1 - Annee2;
    			Output;
    		End;
    		If cpt > 12 then leave;
    	End;
    	Else If find(an,put(i,4.)) = 0 and i EQ 2001 then do until(missing(data)=0);
    		cpt + 1;
    		p + 1;
    		Data = put(CATS(Societe_1,i + p),$societe.);
    		If missing(data) = 0 then do;
    			Annee1 = i;
    			Montant1 = scan(data,2,"/") * 1;
    			Montant2 = scan(data,3,"/") * 1;
    			Ecart = Annee1 - Annee2;
    			Output;
    		End;
    		If cpt > 12 then leave;
    	End;
    End;
    run;
     
    Proc sort data = pr2;
    by Societe_1 Annee1;
    Run;
    Flo00154

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    exactement,

    sacré code !!

    je vous remercie pour votre retour, je vais essayer d'adapter ce code avec mes bases, et je reviendrais vers vous.

    merci pour votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/02/2015, 16h18
  2. Insérer des lignes dans une table
    Par kouki2011 dans le forum SQL
    Réponses: 2
    Dernier message: 28/04/2011, 18h22
  3. Insérer des lignes dans une table efficacement
    Par newbie82 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/07/2007, 17h01
  4. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

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