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 :

Calcul des sommes antérieurs


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut Calcul des sommes antérieurs
    bonsoir,

    j'ai une base avec 4 variables : année (2015, 2016 et 2017) , contrat, nb_sin, type ( 2 modalités: A et B) .

    J'aimerais calculer les antécédents sinistre d'un contrat. Je m'expliquer j'aimerais créer une variable Ancienneté, et une variable antécédent sinistre. Pour un contrat 2017 calculer le cumule des sinistres qu'il aurait eu en 2016 donc ancienneté 1 ans, puis 2016 et 2015 donc ancienneté 2 ans. Puis refaire la mm chose mais pour un contrat 2016 avec les antécédents 2015 donc ancienneté 1 an. L’ensemble de ces cumules est calculer par la variable TYPE.

    Par contre si j'ai un contrat qui n'est présent qu'en 2017, j'aurais ancienneté=0 et ant=.

    J'ai un programme que voici, merci de me dire comment je peux le modifier pour répondre à ma 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
    data test3 /*(drop=Ant1 Ant2)*/;
    set test2; 
    by annee contrat ty; 
    if first.grp_gt then anciennete=0;
     
    else anciennete +1;
     
    Ant1 = Lag1(nbsin);
    Ant2 = Lag2(nbsin);
     
    if anciennete < 1 then Ant1 = .;
     
    if anciennete < 2 then Ant2 = .;
     
    Ant = Sum(Ant1, Ant2);
     
    if last.typ and anciennete > 0 then do;
     
    SinN1 = 1;
     
    if Ant1 in (0, .) then SinN1 = 0;
     
    end;
    run;
    Déjà par rapport à ma problématique j'ai des doutes si dans if first. je dois mettre la variable typ ??

    Donc merci de me dire ce que je peux modifier dans ce programme pour répondre à la question.


    Merci

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    pas sûr d'avoir bien compris le sujet:

    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
     
    data test;
    input annee contrat nb_sin type $;
    cards;
    2015 1 2 A
    2015 1 2 A
    2015 1 5 B
    2016 1 2 A
    2016 1 1 B
    2017 1 2 A
    2017 1 1 B
    2015 2 2 A
    2015 2 2 A
    2015 2 5 B
    2016 2 2 A
    2016 2 1 B
    ;run;
     
    data test1;
    do until(last.contrat);
    set test;
    by contrat;
    if last.contrat  then last_annee=annee;
    end;
     
    do until(last.contrat);
    set test;
    by contrat;
    ant=last_annee-annee;
    output;
    end;
    run;
     
     
    proc sql;
    create table test2(drop =last_annee) as select distinct  a.*,
    case
    when annee ne last_annee then sum(nb_sin) 
    else 0 end as nbr_sin 
    from test1 as a
    group by contrat, type,ant
    order by contrat ,annee;
    quit;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    En fait j’ai une base, et j’aimerais pour un contrat donnée calcul ces antécédent sinistre. J’aimerais dans un premier temps calculer une variable ancienneté contrat qui me dit si ce contrat était bien présent l’annee n-1, ou l’annee N-2, ensuite je somme les sinistre par type selon son ancienneté. Si par exemple j’ai un contrat qui présent en 2016 et 2017, je me place en 2017 et je calcule ces antécédents 2016 s’il en a. Ainsi la variable ancienneté sera égale à un.
    Si par contre un contrat n’est présent qu’une seule année dans ce cas ancienneté c’est zéro et les antécédent sinistre c’ezt NR dans ce cas.

  4. #4
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Le mieux c'est de nous envoyer un échantillons de données et les résultats attendus.

    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Si j'ai bien compris ce code pourrait répondre à ta problématique :
    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
     
    proc sort data = Ta_base ; BY contrat type annee  ; run ; 
     
    data Result (drop =firstan nb_Sin) ;
    ant=0 ;	Som_nb_Sin=0 ;
    do until(last.type);
    set Ta_base;
    BY contrat type annee  ;
    if nb_sin  then ant+1 ;	
    Som_nb_Sin+nb_Sin ;
    if first.type then firstan=annee ; 
    end ;
     
    do until(last.type);
    set Ta_base ;
    BY contrat type annee ;
    anciennete=annee-firstan ;
    end;
    run;
    Cdt Ward

Discussions similaires

  1. Requête MySQL sur plusieurs tables pour calculer des sommes
    Par rico the hobbit dans le forum Requêtes
    Réponses: 9
    Dernier message: 22/01/2018, 14h03
  2. [DOM] calculer des sommes d'un fichier xml avec dom
    Par jean22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 19
    Dernier message: 07/04/2016, 22h55
  3. Problème de calcul des sommes et de pourçantage
    Par sarmerou08 dans le forum Débuter
    Réponses: 5
    Dernier message: 17/05/2011, 18h42
  4. Réponses: 3
    Dernier message: 24/08/2006, 12h56
  5. [newbie]comment calculer la somme des nb pages sum()?
    Par megapacman dans le forum Débuter
    Réponses: 3
    Dernier message: 13/06/2006, 12h03

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