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 :

fusionner 2 lignes


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut fusionner 2 lignes
    Bonjour,

    Je travaille actuellement dans une entreprise sur la base de données SIREN (information sur les entreprises de France)

    Chaque ligne correspond à une période donnée mais des fois j'ai une période qui est séparée en 2 et j'aimerais la fusionner, exemple


    Datdebut Datefin Infos
    1 10 idem
    11 20 idem

    et je voudrais avoir

    Datedebut Datefin Infos
    1 20 idem

    Si les infos des 2 lignes sont identiques


    Merci par avance
    thea13

  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,

    La difficulté de ta demande réside dans le fait de devoir tester si les informations sont identiques sur les deux lignes pour fusionner si c'est le cas.

    Je propose une solution qui fonctionne avec l'hypothèse que tu n'as que deux lignes au maximum pour une entreprise (ce que tu as indiqué dans ton message).

    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
    data test;
    Input ID $ Datdebut Datefin Info1 $ Info2;
    cards;
     A 1 10 idem 10
     A 11 20 idem 10
     B 1 5 dataB 25
     D 6 9 dataD 40
     D 16 21 dataD 21
     C 2 9 dataC 1
     C 10 15 dataC 1
     ;run;
     
     /* Création d'une table qui regroupe les doublons */
     Proc sort data = test nodupkey dupout = test2;
     by id;
     run;
     
     
    Data test3 (drop = ret: rc fc);
    If _n_ = 1 then do;
    IF 0 then set test2;/* déclaration des tables hash */
    	DCL HASH che (dataset: 'test2');
    	che.definekey ('ID', 'Info1', 'Info2');
    	che.definedata ('Datdebut', 'Datefin');
    	che.definedone();
     
    	DCL HASH che2 (dataset: 'test2');
    	che2.definekey ('ID' );
    	che2.definedata ('Info1', 'Info2', 'Datdebut', 'Datefin');
    	che2.definedone();
    End;
    Set test;
    ret = datdebut;
    ret2 = datefin;
    RC = che.find();
    If rc = 0 then do;
    	datdebut = min(datdebut,ret);
    	datefin = max(datefin,ret2);
    	Output;
    End;
    Else do;
    	Output;
    	fc = che2.Find();
    	If fc = 0 then output;
    End;
    Run;
    Flo00154

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci vraiment pour ton aide, ça marche presque...Des fois, j'ai plus de 2 lignes par entreprises, du coup je pense que c'est pour ça que ca ne marche pas totalement... Existe-t'il une solution pour contrer cela?

    Encore merci beaucoup pour ton aide!
    the13

  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
    Si c'est possible mais il faut utiliser d'autres méthodes je pense.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    data test;
    Input ID $ Datdebut Datefin Info1 $ Info2;
    cards;
     A 1 10 idem 10
     A 11 20 idem 10
     B 1 5 dataB 25
     D 6 9 dataD 40
     D 22 25 dataD 29
     D 16 21 dataD 21
     D 23 25 dataD 21
     C 2 9 dataC 1
     C 10 15 dataC 1
     ;run;
     
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "TEST"
    	and name not like 'Dat%'  ;
     
    	Create table test2 as
    	Select *, cats(&liste.) as key
    	from test
    	order by id, key, datdebut;
    quit;
     
    Data test3 (drop = key ret);
    Set test2;
    By key;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdebut;
    Else if Last.Key then do;
    	datdebut = ret;
    	Output;
    End;
    Run;
    Ce code gère les entreprises avec n lignes, fusionne les lignes qui sont communes en gérant les dates et conservent les lignes qui sont différentes.

    Flo00154

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Je suis désolée d'insister, mais le programme ne veut pas marcher sur ma base de données... J'ai tsté ton prog avec t base de données et il marche très bien, mais sur le mien impossible... Je dois oublier un détail mais je n'arrive pas à trouver mon erreur...
    Pour moi test=dadsenquete (ma base), test2=enq2, test3=enq3, id=newnum
    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
     
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "dadsenquete"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from dadsenquete
    	order by newnum, key, datdeb;
    /*ERROR: The following columns were not found in the contributing tables: ID, Info1, Info2.*/
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    /*ERROR: Le fichier WORK.ENQ2.DATA n'existe pas.*/
    By key;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdeb;
    Else if Last.Key then do;
    	datdeb = ret;
    	Output;
    End;
    Run;

  6. #6
    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
    Le nom de ta table doit être en majuscule dans la première requête SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DADSENQUETE"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from dadsenquete
    	order by newnum, key, datdeb;
    quit;
    Flo00154

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    En reprenant le programme ce matin, je n'arrive toujours pas à l'exécuter.
    Je pense que c'est parce que j'ai plus de variables. dans ma table "dadsenquete", j'ai 21 variables.
    car j'ai comme erreur:

    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
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATA1"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from data1
    	order by newnum, key, datdeb;
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    /*ERROR: BY variables are not properly sorted on data set WORK.ENQ2*/
    Run;
    Merci par avance!
    thea13

  8. #8
    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
    Je ne pense pas que ce soit à cause du nombre de variable mais juste une coquille dans le "by". Il faut ajouter Notsorted dans cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    /*ERROR: BY variables are not properly sorted on data set WORK.ENQ2*/
    Run;
    Flo00154

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    MERCI MERCI MERCI VRAIMENT!!! Tout marche!!

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Je pensais que le problème était résolu mais en fait non... J'ai ces 2 lignes identiques qui ne se fusionnent pas. Sur les 2 lignes j'ai des données différentes mais avant de faire la procSQL j'ai fais un "drop", et malgré cette manip, les lignes ne fusionnent pas. Savez-vous où est la problème?
    Je suis vraiment désolée d'insister mais je ne comprends pas où est la problème....

    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
    data date1;
    Input newnum $ Datdebut Datefin siren $ nic contrat_travail conv_coll cpfd depr pcs sexe typ_emploi;
    cards;
    9 1 360 708503479 30 01 1967 C 67 673A 1 O
    9 1 360 708503479 30 01 1967 C 67 673A 1 O 
    ;run;
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATE1"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from date1date
    	order by newnum, key, datdeb;
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    Run;

  11. #11
    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
    Je n'ai pas de problème sur ces lignes de mon côté (après correction de quelques erreurs dans ton code) :

    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
    data date1;
    Input newnum $ Datdebut Datefin siren $ nic contrat_travail conv_coll cpfd $ depr pcs $ sexe typ_emploi $;
    cards;
    9 1 360 708503479 30 01 1967 C 67 673A 1 O
    9 1 360 708503479 30 01 1967 C 67 673A 1 O 
    ;run;
     
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATE1"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from date1
    	order by newnum, key, datdebut;
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = Datdebut;
    Else if Last.Key then do;
    		datdebut = ret;
    		Output;
    End;
    Run;
    Flo00154

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je viens de ressayer le code. Quand je l'effectue sur la table exemple sur le forum, le code fonctionne. Mais quand je le fais sur ma table, le programme tourne et il n'y a pas d'erreur qui s'affiche mais il ne fonctionne pas à chaque fois. Je ne comprends vraiment pas pourquoi....

    thea13

  13. #13
    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,

    Il nous faudrait un dataset d'exemple sur lequel tu constates ce problème pour que je puisse regarder s'il n'y a pas un élément qui n'est pas pris en compte.
    Tu peux envoyer des données fake, du moment que tu as le même problème que sur ta base initiale.

    Flo00154

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Alors,

    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
    data date;
    Input newnum age $ Datdeb Datfin duree nbheur net contrat_travail conv_coll cpfd depr pcs $ sexe typ_emploi $ zempt prob1 prob2 adr_l1 suivi siren $ nic  conv_coll cpfd $ depr pcs $ sexe typ_emploi $;
    cards;
    9 49 1 360 360 2058 19979 01 1967 C 67 673A 1 O 4202 . 7.5 "GUILLET SA" 246 708503479 30
    9 50 361 599 2639 1362 17863 01 1967 C 67 673A 1 O 4202 . 7.5 "GUILLET SA" 246 708503479 30
    ;run;
     
    data date1; drop duree age net nbheur duree; run;
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATE1"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from date1
    	order by newnum, key, datdeb;
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    Run;
    Prob1 est manquante. Alors vu que j'ai des données différentes sur ma base de départ (ce qui est logique pour la salaire ou la durée), donc je crée une sous base avec les données qui sont identiques sur ces 2 lignes. Et ensuite je fais le code. Par contre dans ma base de départ j'ai les variables contrat_trvail, conv_coll, depr et d'autres qui sont en alphanumérique, ça pourrait être ça qui pose problème?

    J'ai aussi essayé de ne garder que les variables newnum, datdeb et datfin, mais ça ne fonctionne pas aussi.
    Je ne comprends pas car quand je teste ton code avec le dataset sur le forum ça fonctionne. Après je travaille sur SAS enterprise guide (possible que ça pose problème?!)

    Sachant que le programme marche pour certaines lignes...
    Merci vraiment pour ton aide!
    thea13

  15. #15
    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
    Effectivement si des variables ne sont pas identiques mais ne doivent pas être prises en compte pour analyser les lignes alors il faut les enlever avec d'exécuter le programme.

    Ensuite en regardant ton programme (après l'avoir corrigé des erreurs) je ne constate pas de pb, les deux lignes sont biens fusionnées en sortie.
    Dans la première étape data tu as plus de variables dans ton instruction INPUT que de champs après le CARDS, es-tu sûre d'avoir envoyé les infos nécessaires ?

    Le fait que les variables soient alphanumériques ne devrait pas poser de problèmes à moins que les modalités soient différentes dedans (ex "GUILLET SA" et " GUILLET SA"), dans ce cas là il faudra corriger ces variables avec une fonction comme COMPRESS.

    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
    /* correction étape data pour importer correctement les infos */
    data date;
    Infile cards missover;
    Input newnum age Datdeb Datfin duree nbheur net contrat_travail $ conv_coll $ cpfd depr $ pcs $ sexe typ_emploi $ zempt prob1 prob2 adr_l1 & :$15. suivi siren $ nic  conv_coll cpfd $ depr pcs $ sexe typ_emploi $;
    cards;
    9 49 1 360 360 2058 19979 01 1967 C 67 673A 1 O 4202 . 7.5 "GUILLET SA"  246 708503479 30
    9 50 361 599 2639 1362 17863 01 1967 C 67 673A 1 O 4202 . 7.5 "GUILLET SA"  246 708503479 30
    ;run;
     
    /* Correction de cette étape : ton code était faux*/
    data date1; 
    set date (drop = duree age net nbheur duree); 
    run;
     
    /* Aucune modification sur le code qui suit et le résultat est bien ce que tu veux */
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATE1"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from date1
    	order by newnum, key, datdeb;
    quit;
     
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    Run;
    Flo00154

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    J'ai créé une sous table où à l'intérieur il n'y a que Newnum datdeb datfin, mais ça ne fait, les lignes ne veulent toujours pas se fusionner....


    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
     
    data date1;
    Infile cards missover;
    Input newnum Datdeb Datfin;
    cards;
    9 1 360
    9 361 599
    ;run;
     
    data date2; set work.date1 (keep= newnum datdeb datfin); run;
     
    proc Sql noprint;
       SELECT name into :liste separated by ',' 
       FROM dictionary.columns 
       WHERE upcase(libname)='WORK' AND upcase(memtype)='DATA' and upcase(memname) like "DATE2"
    	and name not like 'Dat%'  ;
     
    	Create table enq2 as
    	Select *, cats(&liste.) as key
    	from date2
    	order by newnum, key, datdeb;
    quit;
     
    Data enq3 (drop = key ret);
    Set enq2;
    By key notsorted;
    retain ret;
    If first.key and Last.key then output;
    Else if First.key and Last.key = 0 then ret = datdeb;
    Else if Last.Key then do;
    		datdeb = ret;
    		Output;
    End;
    Run;
    A la base j'ai 72561 données, après ce programme j'ai 69764 donc c'est que le programme fonctionne mais pas pour toutes les lignes c'est vraiment ça que je ne comprends pas.

    Si je veux faire cette manip, c'est parce qu'à la base j'ai une table pour les données de 2014 (les jours vont de 1 à 360) et une table pour les données de 2015 (les jours vont aussi de 1 à 360).

    Avant de fusionner les 2 tables j'ai fais +360 aux données de la table de 2015 comme ça j'ai des données qui vont de 1 à 720. Est ce que c'est parce que les données ne sont pas de la même table au départ que du coup la fusion ne peut pas se faire pour certaines variables? Par exemple, est-il possible que pour le newnum 9, la première ligne soit de la base 2014 (c'est le cas) et la deuxième ligne de la base 2015, et donc que la fusion ne se fasse pas?

    Pour la fusion des 2 tables j'ai fais:

    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 données2014;
    Infile cards missover;
    Input newnum Datdeb Datfin;
    cards;
    9 1 360
    ;run;
     
    data données2015;
    Infile cards missover;
    Input newnum Datdeb Datfin;
    cards;
    9 1 239
    ;run;
     
    /* Lier DADS 2014 et 2015 en une seule table*/
    data modif2015; set toto.données2015; datdeb=sum(datdeb,360); datfin=sum(datfin,360); run;
    data DADS2; set toto.données2014 work.modif2015 ; run;
    Les noms des variables sont identiques dans les 2 tables.

    merci
    thea13

  17. #17
    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,

    J'ai regardé mais je n'ai pas de problème sur ces données, j'ai bien une fusion des lignes comme attendu :/

    Flo00154

Discussions similaires

  1. fusionner des lignes d'un datagrid ?
    Par Pascale38 dans le forum Flex
    Réponses: 14
    Dernier message: 06/10/2008, 17h33
  2. Réponses: 1
    Dernier message: 15/09/2008, 10h43
  3. Fusionner des lignes en resultat
    Par kalagool dans le forum DB2
    Réponses: 3
    Dernier message: 30/04/2008, 15h31
  4. fusionner plusieurs lignes d'un champs dans un select?
    Par gwena54 dans le forum Requêtes
    Réponses: 13
    Dernier message: 25/01/2008, 13h29
  5. [SQL-VBA]fusionner des lignes
    Par shagun dans le forum Requêtes et SQL.
    Réponses: 42
    Dernier message: 13/04/2007, 13h37

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