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 :

COUNT par année


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Par défaut COUNT par année
    Bonjour,
    J'ai un petit problème avec une requête.
    J'ai une table comme suit :

    ID DATE DEBUT DATE FIN
    1 01/01/2019 NULL
    2 01/06/2019 NULL
    3 01/06/2019 01/06/2020
    4 01/06/2020 01/07/2020

    Et je veux compter le nombre de "présents" par année.
    Cela devrait me donner ceci :

    ANNEE NB
    2019 3
    2020 4
    2021 2

    En fait je ne vois pas comment faire pour que les ID soient comptés sur plusieurs années...
    Quelqu'un a une idée ?

    D'avance Merci !

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    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 175
    Par défaut
    Bonjour,

    Tu peux faire une requête du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  annee, count(*)
    from
    (
    select id, to_char(date_debut, 'YYYY') annee
    from t
    union 
    select id, to_char(nvl(date_fin, sysdate), 'YYYY')
    from t
    )
    group by annee;
    J'ai considéré qu'une date de fin null signifiait une présence jusqu'à cette année.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Par défaut
    En fait cela compte seulement les années de début et de fin :

    l'ID=1 n'est compté qu'en 2019 et 2022...

    Ma piste actuelle est d'arriver à une table intermédiaire comme ceci pour chaque ID :
    ID ANNEE
    1 2019
    1 2020
    1 2021
    1 2022

    Ceci avec une table "calendrier" contenant toutes les années.

    Mais là je sèche un peu...

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 430
    Par défaut
    Bonjour,
    Tu peux partir d'une CTE qui liste les années qui sont dans la plage qui t'intéresse, quitte à la générer à partir de ta table.
    Il suffira ensuite de compter les années qui sont supérieures ou égales à l'année de la date de début, et inférieures ou égales à la date de fin si renseignée.
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with calendrier as 
    (
    select distinct datepart(LaDate,year) as annee
    from LaTable)
    select annee,count(1)
    from calendrier
    inner join LaTable on calendrier.annee >= datepart(LaTable.LaDate) and (calendrier.annee <= datepart(LaTable.LaDate) or LaTable.LaDate is null)
    Tatayo.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Par défaut
    C'est bon j'ai réussi , merci !

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 430
    Par défaut
    Peux-tu nous montrer ta requête ?
    Elle pourrait servir à d'autres personnes qui auraient un problème similaire.

    Tatayo.

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    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 175
    Par défaut
    Citation Envoyé par Ludix_ Voir le message
    En fait cela compte seulement les années de début et de fin :

    l'ID=1 n'est compté qu'en 2019 et 2022...

    Ma piste actuelle est d'arriver à une table intermédiaire comme ceci pour chaque ID :
    ID ANNEE
    1 2019
    1 2020
    1 2021
    1 2022

    Ceci avec une table "calendrier" contenant toutes les années.

    Mais là je sèche un peu...
    Oui c'est vrai, il faut compter les années entre 2, je suis allé un peu trop vite
    Sinon avec une requête connect by ou une requête CTE comme tatayo le suggère.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/06/2018, 14h33
  2. [Conception] Trier par année
    Par chouchouboy dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/06/2006, 00h13
  3. [10g] Archivage de données par années
    Par Cereal123 dans le forum Oracle
    Réponses: 7
    Dernier message: 24/04/2006, 09h35
  4. [MySQL] Select count par rapport à une date
    Par ruty dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 02/04/2006, 22h17
  5. [sql 9i] group by par années ;)
    Par booth dans le forum Oracle
    Réponses: 7
    Dernier message: 04/10/2005, 10h42

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