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

Langage SQL Discussion :

Dates qui se suivent


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Dates qui se suivent
    Bonjour,
    J'ai quelques soucis pour réaliser une requête. Voici mon problème :

    Ma table :
    Matricule  grade      Service      Date_début            Date_fin
    52              B3       2510          01/01/2015             30/06/2015
    52              B2       2510          01/07/2015             31/12/2015
    52              B1       2510          01/01/2016             30/06/2016
    52              B1       3120          01/07/2016             31/12/2016
    52              A2       3120          01/01/2017             31/12/2017
    52              A2       2510          01/01/2018             31/12/2099

    Il faut une ligne par affectation sans le grade
    Résultat attendu :
    Matricule            Service         Date_début            Date_fin
    52                     2510            01/01/2015            30/06/2016
    52                     3120            01/07/2016            31/12/2017
    52                     2510            01/01/2018            31/12/2099
    Ma requête actuelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT MATRICULE,
               SERVICE,
    	   min(Date_début),
    	   max(Date_fin)
    from AFFECTATION 
    where MATRICULE='52' 
    group by  MATRICULE,SERVICE
    Mais elle me retourne
    Matricule            Service         Date_début            Date_fin
    52                     2510            01/01/2015            31/12/2099
    52                     3120            01/07/2016            31/12/2017
    Elle ne prend pas en compte le changement de service intermédiaire

    J'ai essayé avec case et datediff mais ma requête est boucle et ne me sort pas le résultat attendu....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a1.MATRICULE,
               a1.SERVICE,
    	   min(a1.Date_début),
    	   case when Datediff(day, a2.Date_fin,a1.Date_début)='1' and a1.MATRICULE=a2.MATRICULE and a1.SERVICE=a2.SERVICE then a2.Date_fin else a1.Date_fin  end 
    from AFFECTATION a1, AFFECTATION a2
    where a1.MATRICULE='52' 
    group by  a1.MATRICULE,a1.SERVICE
    Pouvez-vous m'aider, svp?

  2. #2
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par Loline77 Voir le message
    Il faut une ligne par affectation sans le grade
    Résultat attendu :
    Matricule Service Date_début Date_fin
    52 2510 01/01/2015 30/06/2016
    52 3120 01/07/2016 31/12/2017
    52 2510 01/01/2018 31/12/2099
    Si j'ai bien compris, ce qui est attendu c'est la succession chronologique par matricule dans les services, sans tenir compte des changements de grade.

    Pouvez-vous essayer, en SQL des plus basiques :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT A1.MATRICULE, A1.SERVICE, min(A1.Date_début), max(A2.Date_fin)
    from AFFECTATION A1
    INNER JOIN AFFECTATION A2 ON (A1.MATRICULE = A2.MATRICULE AND A1.SERVICE = A2.SERVICE)
    where A1.MATRICULE='52'
    AND    A1.Date_début <= A2.Date_début
    AND    not exists (select 1 from AFFECTATION  A3
                             where A3.MATRICULE = A1.MATRICULE
                                AND A3.SERVICE <> A1.SERVICE
                                AND A3.Date_début between A1.Date_début and A2.Date_fin)
    GROUP BY A1.MATRICULE, A1.SERVICE

    Mais pour tout ce qui est gestion des chronologies, les possibilités dépendent grandement de votre base de données et de sa version.
    Nota : pour poster une requête, il est recommandé de les entourer des balises [CODE] (utiliser le bouton Nom : CaptureBoutonBalisesCode.JPG
Affichages : 109
Taille : 7,9 Ko disponible au-dessus de la zone de message)
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Malheureusement la requête ne ressort pas le résultat attendu (le changement et retour sur le service 2510 ne se voit toujours pas) et les dates de début ne sont pas les bonnes.
    Merci pour votre aide.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Quelle est ta BD? Gère-t-elle les fonctions analytiques?

  5. #5
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Oui, ce serait plutôt comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT MATRICULE, SERVICE, MIN(DATEDEB) AS MINDEB, MAXFIN
    FROM 
    (SELECT A1.MATRICULE AS MATRICULE, A1.SERVICE AS SERVICE, A1.Date_début AS DATEDEB, MAX(A2.Date_fin) AS MAXFIN
       FROM  AFFECTATION AS A1 INNER JOIN AFFECTATION AS A2 ON (A1.SERVICE = A2.SERVICE) AND (A1.MATRICULE = A2.MATRICULE)
     WHERE  A1.MATRICULE='52'
        AND   A1.Date_début <= A2.Date_début
        AND   NOT EXISTS (SELECT  1    FROM AFFECTATION  A3
                                   WHERE  A3.MATRICULE = A1.MATRICULE
                                       AND  A3.SERVICE <> A1.SERVICE
                                       AND  A3.Date_début between A1.Date_début and A2.Date_fin)
     GROUP BY A1.MATRICULE, A1.SERVICE, A1.Date_début ) AS SELECTION1
     
    GROUP BY MATRICULE, SERVICE, MAXFIN
    ORDER BY MIN(DATEDEB) ;
    Mais, à nouveau, selon les bases de données, il existe des fonctions SQL plus puissantes.
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Si le SGBD connait les fonctions OLAP, alors la méthode Tabibitosan s'impose:

    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
    with tab0(CMAT, CSRV, CDEB, CFIN) as
        (select 52, 2510, '2015-01-01', '2015-06-30'   union all
         select 52, 2510, '2015-07-01', '2015-12-31'   union all
         select 52, 2510, '2016-01-01', '2016-06-30'   union all
         select 52, 3120, '2016-07-01', '2016-12-31'   union all
         select 52, 3120, '2017-01-01', '2017-12-31'   union all
         select 52, 2510, '2018-01-01', '2099-12-31'   union all
         select 61, 2510, '2015-01-15', '2015-04-30'   union all
         select 61, 2510, '2015-05-01', '2015-10-31'   union all
         select 61, 3360, '2015-11-01', '2016-12-31'   union all
         select 61, 2510, '2017-01-01', '2099-12-31'
        )
      , tgrp as
       (select tab0.*
             , row_number()  
               over(partition by CMAT
                    order by CDEB)
             - row_number()
               over(partition by CMAT, CSRV
                    order by CDEB) as CTRI
        from tab0
       )
    select CMAT
         , CSRV
         , min(CDEB)
         , max(CFIN) 
    from tgrp
    group by CMAT
           , CSRV
           , CTRI
    order by CMAT
           , min(CDEB)
    Résultat :
    CMAT CSRV min(CDEB) max(CFIN)
    52 2510 2015-01-01 2016-06-30
    52 3120 2016-07-01 2017-12-31
    52 2510 2018-01-01 2099-12-31
    61 2510 2015-01-15 2015-10-31
    61 3360 2015-11-01 2016-12-31
    61 2510 2017-01-01 2099-12-31

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Merci
    La solution de escartefigue fonctionne parfaitement. Merci !

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

Discussions similaires

  1. [XL-2016] Dates qui se suivent sur plusieurs lignes
    Par lulu92 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/12/2020, 18h42
  2. [BI4] somme cumulative, dates qui se suivent
    Par dvdhag123 dans le forum Webi
    Réponses: 7
    Dernier message: 06/04/2016, 11h14
  3. comparer 2 dates d'echeances qui se suivent
    Par samia004 dans le forum Développement
    Réponses: 5
    Dernier message: 22/07/2010, 15h29
  4. [Dates] Periodes qui se suivent ?
    Par bicz400 dans le forum Langage
    Réponses: 4
    Dernier message: 15/04/2008, 14h15
  5. Group by sur Produit mais avec date qui se suivent
    Par suantay dans le forum Langage SQL
    Réponses: 9
    Dernier message: 29/02/2008, 12h13

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