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 :

Calcul nombre de mois distincts sur différentes périodes


Sujet :

Langage SQL

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

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2020
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Calcul nombre de mois distincts sur différentes périodes
    Bonjour,

    La requête suivante me sort le résultat ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.matcle, b.datent, b.datsor
    from hr.ZY00 a, hr.ZYES b
    where a.nudoss = b.nudoss
    and a.matcle = '0001'
    order by a.matcle, b.datent;
    0001 11/06/20 31/07/20
    0001 01/08/20 14/09/20
    0001 15/09/20 30/09/20
    0001 15/10/20 31/12/99

    Je voudrais ajouter dans ma requête la possibilité de compter le nombre de mois distincts (pas des mois complets, 1 jour suffit), soit :
    0001 11/06/20 31/07/20 >> 2 mois
    0001 01/08/20 14/09/20 >> 2 mois
    0001 15/09/20 30/09/20 >> 0 mois (car 09/20 déjà compté ci-dessus)
    0001 15/10/20 31/12/99 >> 3 mois

    Je voudrais donc que ma requête me donne un nombre de 7 mois pour le matricule 0001

    Merci pour vos retours.

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

    Es-tu sûre pour ta dernière ligne ?

    0001 15/10/20 31/12/99

    C'est un bon exemple qui montre pourquoi il ne faut surtout pas parler de l'année sur 2 chiffres. S'agit-il de 1999, 2099, 9999?
    Sinon quelle est ta BDD?

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

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2020
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Il s'agit d'une erreur :

    0001 11/06/20 31/07/20 >> 2 mois
    0001 01/08/20 14/09/20 >> 2 mois
    0001 15/09/20 30/09/20 >> 0 mois (car 09/20 déjà compté ci-dessus)
    0001 15/10/20 31/12/20 >> 3 mois

    Il s'agit d'une BDD ORACLE

  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
    Voilà une possibilité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with v 
    as (SELECT a.matcle, b.datent, b.datsor
    from hr.ZY00 a, hr.ZYES b
    where a.nudoss = b.nudoss
    and a.matcle = '0001'
    )
    select matcle, count(distinct add_months(trunc(datent, 'mm'), level-1))
    from sample_data
    connect by level <= months_between(last_day(datsor), trunc(datent, 'mm')) + 1 
                        and matcle = prior matcle 
                        and prior datent = datent 
                        and prior sys_guid() is not null 
    group by matcle;
    On doit pouvoir faire plus simple, je regade.

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

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2020
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    J'ai lancé cette requête mais cela mouline, mouline, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with v 
    as (SELECT a.matcle, b.datent, b.datsor
    from hr.ZY00 a, hr.ZYES b
    where a.nudoss = b.nudoss
    and a.matcle = '00001'
    )
    select c.matcle, count(distinct add_months(trunc(d.datent, 'mm'), level-1))
    from hr.ZY00 c, hr.ZYES d
    where c.nudoss = d.nudoss
    connect by level <= months_between(last_day(d.datsor), trunc(d.datent, 'mm')) + 1 
                        and c.matcle = prior c.matcle 
                        and prior d.datent = d.datent 
                        and prior sys_guid() is not null 
    group by c.matcle;

  6. #6
    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
    Désolé, pb de copié-collé. Voici la requête:

    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
    with v1 
    as (SELECT a.matcle, b.datent, b.datsor
    from hr.ZY00 a, hr.ZYES b
    where a.nudoss = b.nudoss
    and a.matcle = '00001'
    ),
    v2 as (select c.matcle, add_months(trunc(d.datent, 'mm'), level-1) month_date
           from v1
           connect by level <= months_between(last_day(d.datsor), trunc(d.datent, 'mm')) + 1 
                        and c.matcle = prior c.matcle 
                        and prior d.datent = d.datent 
                        and prior sys_guid() is not null 
           )
    select matcle, count(distinct month_date)
    from v2
    group by matcle;
    J'ai mis un group by mais il n'est pas nécessaire pour un matricule donné.

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

Discussions similaires

  1. [XL-2010] Nombres de jours (lundi, mardi..) d'un mois précis sur une période
    Par Thomas.lp dans le forum Excel
    Réponses: 6
    Dernier message: 14/01/2019, 17h47
  2. [XL-2010] Condition : calcul du nombre de jours consécutifs sur une période
    Par willyrod dans le forum Excel
    Réponses: 11
    Dernier message: 20/02/2013, 16h06
  3. Comptage du nombre de dossiers actifs sur une période
    Par thtghgh dans le forum SAS Base
    Réponses: 4
    Dernier message: 18/07/2012, 11h53
  4. [XL-2003] Calculer Nombre de mois
    Par sami_rio dans le forum Excel
    Réponses: 4
    Dernier message: 27/01/2010, 23h32

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