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

SQL Oracle Discussion :

Reconstituer des périodes d'absences


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Reconstituer des périodes d'absences
    Bonjour,

    Je m'arrache les cheveux depuis plusieurs jours pour trouver une solution au problème que je vais vous présenter.

    Je souhaite reconstituer les périodes d'absences des salariés.

    Ma table T2 :

    id -> identifiant du salarié
    date_abs -> jour d'absence
    code_abs -> motif de l'absence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    id ; date_abs ; code_abs 
    1  ; 20130101 ; 101
    1  ; 20130102 ; 101 
    1  ; 20130103 ; 101
    1  ; 20130201 ; 145 
    1  ; 20130202 ; 145 
    1  ; 20130203 ; 145 
    1  ; 20130204 ; 145 
    2  ; 20130101 ; 101
    2  ; 20130102 ; 101
    J'ai cherché un peu partout ; j'ai trouvé un peu d'aide mais mon résultat est toujours faux.

    Voici mon 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
    SELECT         
        id, 
        min(date_abs) AS dtdeb, 
        MAX(date_abs) AS dtfin, 
        code_abs, 
        COUNT(*)  AS nbjr
    FROM 
    (
        SELECT 
            id, 
            date_abs, 
            code_abs, 
            ROW_NUMBER() over(ORDER BY date_abs ASC) - ROW_NUMBER() over(partition BY code_abs ORDER BY date_abs ASC) AS grp
        FROM t2
    )
     
    GROUP BY    
        id, 
        code_abs, 
        grp
    ORDER BY 
        id, 
        dtdeb
    Je voudrais reconstituer la période d'absence avec une date de début et une date de fin par salarié et motif d'absence. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id; dtdeb;dtfin;code_abs
    1;20130101;20130103;101
    Je vous remercie d'avance de m'apporter votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Qu'attendez-vous comme résultat ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Qu'attendez-vous comme résultat ?
    J'ai modifié mon post, j'y ai ajouté un exemple de résultat attendu.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Merci, mais là où je m'interroge c'est que la requête produit le résultat attendu :
    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
    with t2 (id, date_abs, code_abs) as
    (
    select 1, 20130101, 101 from dual union all
    select 1, 20130102, 101 from dual union all
    select 1, 20130103, 101 from dual union all
    select 1, 20130201, 145 from dual union all
    select 1, 20130202, 145 from dual union all
    select 1, 20130203, 145 from dual union all
    select 1, 20130204, 145 from dual union all
    select 2, 20130101, 101 from dual union all
    select 2, 20130102, 101 from dual
    )
      SELECT id
           , min(date_abs) AS dtdeb
           , MAX(date_abs) AS dtfin
           , code_abs
           , COUNT(*)      AS nbjr
        FROM (SELECT id
                   , date_abs
                   , code_abs
                   , ROW_NUMBER() over(                      ORDER BY date_abs ASC)
                   - ROW_NUMBER() over(partition BY code_abs ORDER BY date_abs ASC) AS grp
                FROM t2)
    group by id, code_abs, grp
    order by id, dtdeb;
     
    ID DTDEB    DTFIN    CODE_ABS NBJR
    -- -------- -------- -------- ----
     1 20130101 20130103 101         3
     1 20130201 20130204 145         4
     2 20130101 20130102 101         2
    Il manque peut-être le ID dans le partition by de chacun des row_number(), mais sur ce jeu de données ça ne se voit pas.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Merci, mais là où je m'interroge c'est que la requête produit le résultat attendu :
    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
    with t2 (id, date_abs, code_abs) as
    (
    select 1, 20130101, 101 from dual union all
    select 1, 20130102, 101 from dual union all
    select 1, 20130103, 101 from dual union all
    select 1, 20130201, 145 from dual union all
    select 1, 20130202, 145 from dual union all
    select 1, 20130203, 145 from dual union all
    select 1, 20130204, 145 from dual union all
    select 2, 20130101, 101 from dual union all
    select 2, 20130102, 101 from dual
    )
      SELECT id
           , min(date_abs) AS dtdeb
           , MAX(date_abs) AS dtfin
           , code_abs
           , COUNT(*)      AS nbjr
        FROM (SELECT id
                   , date_abs
                   , code_abs
                   , ROW_NUMBER() over(                      ORDER BY date_abs ASC)
                   - ROW_NUMBER() over(partition BY code_abs ORDER BY date_abs ASC) AS grp
                FROM t2)
    group by id, code_abs, grp
    order by id, dtdeb;
     
    ID DTDEB    DTFIN    CODE_ABS NBJR
    -- -------- -------- -------- ----
     1 20130101 20130103 101         3
     1 20130201 20130204 145         4
     2 20130101 20130102 101         2
    Il manque peut-être le ID dans le partition by de chacun des row_number(), mais sur ce jeu de données ça ne se voit pas.
    Il est exactement là le problème. Sur ce jeu de données, le résultat est correcte mais sur un jeu de donnée plus important, ça ne va pas.

    Je suis presque sûr que cela vient des partition by. Je vais voir.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Merci de présenter un jeu de test qui pose problème, sinon difficile de vous aider efficacement.

Discussions similaires

  1. comment créer des périodes ?
    Par cocofighter dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/01/2008, 18h08
  2. requête sur des périodes délimitées par des dates
    Par gvdmoort dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/10/2007, 12h09
  3. Réponses: 5
    Dernier message: 14/09/2007, 20h44
  4. Sauvgarde des Message en Absence
    Par faressam dans le forum Outlook
    Réponses: 3
    Dernier message: 14/09/2007, 18h10
  5. [Conception] Prix en fonctions des périodes
    Par developpertun dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 05/04/2006, 12h26

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