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 :

Somme entre les dates de plusieurs lignes


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Somme entre les dates de plusieurs lignes
    Bonjour à tous,

    voilà, j'ai un petit soucis que je n'arrive pas à régler. J'ai une table avec plusieurs lignes par individus, dans chaque ligne il y a une date de début et une date de fin, et je souhaite, à partir de la dernière date, calculer le total (en mois ou jours) avec les dernières dates qui se suivent.

    C'est à dire que si pour un seul identifiant j'ai trois ligne :
    Date_deb=01/01/2017 ; date_fin=02/03/2018
    Date_deb=25/11/2016 ; date_fin=31/12/2016
    date_deb=01/05/2015 : date_fin=21/07/2015

    alors je ne voudrais calculer le total que des deux premières lignes puisque l'autre ne les suit pas. Pareil, il est possible que certaines lignes se chevauchent d'un jour ou deux.
    J'imaginais passer par un proc sql mais très franchement je sèche un peu... L'un.e de vous aurait une idée ?
    Merci beaucoup

  2. #2
    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 : 46
    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
    Bonjour.
    Plutôt que du SQL je pense qu'ici l'étape DATA sera plus adaptée. Avec RETAIN ou LAG on peut récupérer la date de fin de la ligne précédente et la comparer à la date de début de la ligne courante. Si l'écart est négatif il y a chevauchement, s'il est nul les dates s'enchaînent, s'il est inférieur à un certain seuil de tolérance les périodes sont quasiment à la suite. On peut même repérer avec WEEKDAY si la date de fin / de début est dans un week-end.
    A partir de ces tests, on alimente un compteur qui s'initialise à chaque individu (avec un SET BY) et on fera ensuite les sommes par individu et valeur du compteur avec une proc MEANS ou du SQL, au choix.
    Évidemment c'est indispensable de trier au préalable par individu et date de début pour éviter les surprises.
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour, merci pour votre réponse.

    Effectivement, avec retain ça fonctionne bien. J'arrive a calculer pour chaque inscriptionla différence avec la première date. par contre, je n'arrive pas à faire le calcul pour qu'il me dise si la date de fin est équivalent à la date de début de la ligne précédente :
    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
     
    data tab2;set tab;
    	by id descending DateInscription ;
    	retain DerDate PrecDate ;
    	format DerDate PrecDate DDMMYY10. ;
    	if first.DateInscription then PrecDate=DateInscription ;
    	if first.id then do ;
    		diff=0 ;
    		DerDate=DateInscription ;
    		end ;
    	else if first.DateInscription then do ;
    		duree=-1*(DateInscription-DerDate) ; 
    		if DateFin=PrecDate or DateFin+1=PrecDate or DateFin-1=PrecDate then diff=0;else diff=1 ;
    		end ;		
    run;
    Là, dans PrecDate, j'ai la date d'inscription de la ligne, et non de la précédente. Une idée ?
    Merci

  4. #4
    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 : 46
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    precDate = LAG(dateInscription) ;
    sans mettre de IF autour.
    Bon courage.
    Olivier

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup, ça fonctionne parfaitement !

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

Discussions similaires

  1. [TQuery] Requête somme entre deux dates
    Par delphino7 dans le forum Bases de données
    Réponses: 15
    Dernier message: 22/04/2008, 10h43
  2. Réponses: 1
    Dernier message: 07/03/2008, 12h42
  3. Concaténer les champs de plusieurs lignes en un seul
    Par gvdmoort dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/09/2007, 12h01
  4. Liens entre les sources de plusieurs projets (Maven2)
    Par romaintaz dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 18/08/2006, 14h03
  5. [MySQL] Checkboxes : récupérer les informations sur plusieurs lignes
    Par eric41 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 12/06/2006, 12h41

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