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 :

Problème de Group By sur des dates (SQL2 - Oracle 8.1.7)


Sujet :

Langage SQL

  1. #1
    PHC
    PHC est déconnecté
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème de Group By sur des dates (SQL2 - Oracle 8.1.7)
    Bonjour,

    Je souhaiterais avoir votre avis sur une requête 'select'. Je dispose d'une table contenant un champ Date. Je souhaite faire un group by par mois pour utiliser une fonction de groupe sur un champ numérique. La requête n'est pas compliqué à écrire. Le problème vient du fait que pour certains mois aucune valeur n'est présente et donc le group by passe outre. Exemple si aucune date du mois d'août se trouve dans la table alors je n'aurais pas de résultat nul ou 0 pour ce mois (ce qui est logique).

    Mon problème vient du fait que je ne dois utiliser que du SQL, pas de table intermédiaire et donc pas de procédure.

    Ci-dessous un exemple simple :
    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
     
     
    create table PHC 
    ( 
       Jour Date, 
        nb   Integer 
    ); 
     
     define debut = '06/08/2003' 
     
     insert into PHC values (to_date('10/10/2003','DD/MM/YYYY'),1); 
     insert into PHC values (to_date('11/10/2003','DD/MM/YYYY'),2); 
     insert into PHC values (to_date('10/12/2003','DD/MM/YYYY'),3); 
     insert into PHC values (to_date('11/12/2003','DD/MM/YYYY'),4); 
     
     
     select to_char(Jour,'MM/YYYY'),sum(nb) 
       from PHC 
      where Jour between to_date('&debut','DD/MM/YYYY') and add_months(to_date('&debut','DD/MM/YYYY'),12)-1 
      group by to_char(Jour,'MM/YYYY');


    LE script suivant me renvoie un résultat normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Mois        sum(nb) 
    ---------   ---------- 
    10/2003   3 
    12/2003   7
    Je souhaiterais en fait obtenir les lignes manquantes en fonction du paramètre de date.

    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
     
     
    Mois        sum(nb) 
    ---------   ---------- 
    08/2003   0 
    09/2003   0 
    10/2003   3 
    11/2003   0 
    12/2003   7 
    01/2004   0 
    02/2004   0 
    03/2004   0 
    04/2004   0 
    05/2003   0 
    06/2003   0 
    07/2003   0
    Merci .

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    avec des UNIONS tu devrais t'en tirer :

    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
    select Jour,sum(nb) 
    from (
    select to_char(Jour,'MM/YYYY') jour,nb
       from PHC 
      where Jour between to_date('&debut','DD/MM/YYYY') and add_months(to_date('&debut','DD/MM/YYYY'),12)-1 
    UNION ALL
    select '01/2003' jour,0 nb from dual
    UNION ALL
    select '02/2003' jour,0 nb from dual
    UNION ALL
    select '03/2003' jour,0 nb from dual
    UNION ALL
    select '04/2003' jour,0 nb from dual
    UNION ALL
    select '05/2003' jour,0 nb from dual
    UNION ALL
    select '06/2003' jour,0 nb from dual
    UNION ALL
    select '07/2003' jour,0 nb from dual
    UNION ALL
    select '08/2003' jour,0 nb from dual
    UNION ALL
    select '09/2003' jour,0 nb from dual
    UNION ALL
    select '10/2003' jour,0 nb from dual
    UNION ALL
    select '11/2003' jour,0 nb from dual
    UNION ALL
    select '12/2003' jour,0 nb from dual)
      group by Jour;
    par contre, ce qui est compliqué dans ton cas c'est qu'a priori tu ne sais pas quelles années tu traites... le trompe-je

  3. #3
    PHC
    PHC est déconnecté
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, j'avais déjà envisagé cette solution mais elle ne plait pas trop à mes directeurs techniques.
    Merci quand même.
    Si d'autres ont des idées, je les en remercie d'avance.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    Tu peux toujours creer une table qui contient la liste des mois dans le format suivant plus une jointure externe dessus :

    Table Calendar
    01/2003
    02/2003
    03/2003
    ....


    ensuite tu fais soit une requete imbriqué soit tu passe par une vue.

  5. #5
    Membre actif
    Avatar de MashiMaro
    Profil pro
    Inscrit en
    Février 2003
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 180
    Points : 213
    Points
    213
    Par défaut
    Tu peux aussi faire une jointure sur elle même avec la table en utilisant l'opérateur LEFT JOIN.

    Je ne prends pas le risque de te donner un exemple car je ne maitrise pas Oracle qui est différents des autres SGBD que je connais.
    MashiMaro

    L'homme sage apprend de ses erreurs, l'homme très sage apprend des erreurs des autres.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    Citation Envoyé par MashiMaro
    Tu peux aussi faire une jointure sur elle même avec la table en utilisant l'opérateur LEFT JOIN.

    Je ne prends pas le risque de te donner un exemple car je ne maitrise pas Oracle qui est différents des autres SGBD que je connais.
    pas possible car le mois n'existe pas si il n'y a pas de valeur pour NB dans la table.

  7. #7
    Membre actif
    Avatar de MashiMaro
    Profil pro
    Inscrit en
    Février 2003
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 180
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par Goshiz
    Citation Envoyé par MashiMaro
    Tu peux aussi faire une jointure sur elle même avec la table en utilisant l'opérateur LEFT JOIN.

    Je ne prends pas le risque de te donner un exemple car je ne maitrise pas Oracle qui est différents des autres SGBD que je connais.
    pas possible car le mois n'existe pas si il n'y a pas de valeur pour NB dans la table.
    Autant pour moi, j'ai du lire en diagonale...

    Ta solution d'une table avec les dates est je pense la meilleure
    MashiMaro

    L'homme sage apprend de ses erreurs, l'homme très sage apprend des erreurs des autres.

  8. #8
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Si tu peux ajouter la zone MY correspondant à TO_CHAR(JOUR,'MM/YYYY') (gérée dans un trigger), tu pourras faire :

    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
    select CAL.MY j, SUM(NVL(NB,0)) N
    from (      SELECT '01/2003' MY FROM DUAL
          UNION SELECT '02/2003' FROM DUAL
          UNION SELECT '03/2003' FROM DUAL
          UNION SELECT '04/2003' FROM DUAL
          UNION SELECT '05/2003' FROM DUAL
          UNION SELECT '06/2003' FROM DUAL
          UNION SELECT '07/2003' FROM DUAL
          UNION SELECT '08/2003' FROM DUAL
          UNION SELECT '09/2003' FROM DUAL
          UNION SELECT '10/2003' FROM DUAL
          UNION SELECT '11/2003' FROM DUAL
          UNION SELECT '12/2003' FROM DUAL) CAL,
          PHC
    WHERE CAL.MY = PHC.MY (+)
    GROUP BY CAL.MY
    La jointure directement sur to_char(jour,'MM/YYYY') ne fonctionne pas

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  9. #9
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Citation Envoyé par MashiMaro
    Autant pour moi, j'ai du lire en diagonale...
    juste pour ta culture personnelle, on écrit "au temps pour moi".

    http://www.langue-fr.net/index/A/au_temps-autant.htm
    Membre éclairé, lol !

  10. #10
    PHC
    PHC est déconnecté
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je vous remercie de vos solutions.
    Je vais utiliser la première méthode avec une union simple de DUAL en fanction de ma date.

    PHC

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

Discussions similaires

  1. [AC-2007] Problèmes sur des dates avec Vraifaux
    Par l.flipper dans le forum IHM
    Réponses: 4
    Dernier message: 07/09/2012, 16h01
  2. Réponses: 1
    Dernier message: 20/09/2011, 10h27
  3. Problème de comptage sur des dates
    Par Oberown dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2007, 17h04
  4. Problèmes Test sur des dates
    Par guigui11 dans le forum ASP
    Réponses: 1
    Dernier message: 11/12/2006, 16h18
  5. [MySQL] Problème de requête sur des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2006, 13h08

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