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

 Oracle Discussion :

Probleme avec une Requete pour Comptage


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut Probleme avec une Requete pour Comptage
    Bonjour,

    j'ai 2 tables :

    - intervention (comprenant des dates, des intervenants et un critère)
    - param_critere (qui contient les critères, leur libelles, un numéro + d'autres infos)

    Je veux faire une requête me ramenant le COMPTE DES INTERVENTIONS groupé par critères (mais même le comp)te pour les critères inutilisés)

    Par exemple : j'ai 8 critères dans ma table param_critère (1001 à 1008) mais dans la table intervention, je n'en ai aucune avec les codes 1007 et 1008 donc si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select count(*), param_critere.critere_numero 
    from param_critere, intervention
    where param_critere.critere = intervention.critere
    group by param_critere.critere_numero;
    Ça ne me ramene pas les COMPTES pour 1007 et 1008.

    J'ai essayé en mettant un (+) pour faire une jointure externe mais ca ne me ramené pas les résultats.

    Si quelqu'un pouvait m'aider pour que je reteste et corrige mon soucis.

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    il faut faire une jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT case when count(*) is null then 0 else count(*) end as "Nombre", param_critere.critere_numero 
    FROM param_critere, intervention
    WHERE param_critere.critere = intervention.critere (+)
    GROUP BY param_critere.critere_numero;
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  3. #3
    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
    Pour le joli case on pourrait utiliser la fonction NVL ou mieux la fonction COALESCE.
    Mais en fait dans ce cas c'est inutile, le comptage renverra 0 s'il ne trouve rien.

    Dès lors qu'on a plus d'une table dans une requête, il est fortement avisé d'utiliser des alias de table.

    Et enfin, depuis la 9i (presque dix ans), Oracle permet l'écriture normative OUTER JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT pc.critere_numero,
             count(*) as nb_interventions
        FROM param_critere pc
             LEFT OUTER JOIN intervention iv
               ON iv.critere = pc.critere
    GROUP BY pc.critere_numero;

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    J'ai utilisé vos 2 réponses maix ca n'affiche pas les criteres pour lesquels le COMPTE est 0 donc je me retrouve dans le meme cas.

    Je vous note ICI exactement les requetes que j'ai lancé et les résultats obtenus sous TOAD.

    1ère requete avec toutes les conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select PC.CRITERE_NUMERO,count(*) from pmi_critere PC,pmi_intervention PI
    where PI.CRITERE_1_NUMERO (+) = PC.CRITERE_NUMERO
    and PC.NUMERO_CRITERE = 1
    and PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
    and PI.INTERVENTION_DATE >= 20100101 and PI.INTERVENTION_DATE <= 20101231
    and PC.TRAVAIL_COLLECTIF = 'NON'
    group by PC.CRITERE_NUMERO
    order by PC.CRITERE_NUMERO;
    PS : J'ai mis le (+) de ce coté et j'obtiens le meme résultat en enlevant ce (+) et en le mettant de l'autre coté de la jointure.

    Voici mes résultats obtenus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CRITERE_NUMERO   COUNT(*)
    -------------- ----------
              5101        298
              5102         62
              5103         47
              5104          3
              5105          2
              5107        204
              5108         67
              5109          8
              5110         21
              5111        200
              5112          8
    (Il me manque des critères qui font bien partie de ma sélection car si dans cette requete, j'enleve la condition de dates, le résultat obtenu est correct car tous les criteres sont utilisés durant ma période (depuis 2007) ... voir le résultat ci dessous sur toute la période

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CRITERE_NUMERO   COUNT(*)
    -------------- ----------
              5101        463
              5102         81
              5103         96
              5104          4
              5105          3
              5106          7
              5107        289
              5108        134
              5109         18
              5110         23
              5111        272
              5112         14

    J'ai bien le 5006 alors que je ne le vois pas avec la valeur 0 dans ma 1ere requete.

    J'ai meme etsté avec le case et le nvl mais ca ne donne rien.

    PS : Je suis en Oracle 9.2

    Merci d'avance car je suis vraiment bloqué pour mon programme.

  5. #5
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    A priori le code suivant devrait marcher (je n'ai pas de jeu d'essais, je n'ai pas testé) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select PC.CRITERE_NUMERO
         , count(*) 
    from pmi_critere PC
         left outer join pmi_intervention PI
           on    ( PI.CRITERE_1_NUMERO = PC.CRITERE_NUMERO
               and PC.NUMERO_CRITERE = 1
               and PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
               and PI.INTERVENTION_DATE between to_date('20100101','YYYYMMDD' and to_date('20101231','YYYYMMDD') 
               and PC.TRAVAIL_COLLECTIF = 'NON' )
    group by PC.CRITERE_NUMERO
    order by PC.CRITERE_NUMERO;

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par ojo77 Voir le message
    A priori le code suivant devrait marcher (je n'ai pas de jeu d'essais, je n'ai pas testé)

    Quand j'execute, voici le message d'erreur
    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
    SQL> SELECT PC.CRITERE_NUMERO
      2       , count(*) 
      3  FROM pmi_critere PC
      4       LEFT OUTER JOIN pmi_intervention PI
      5         ON    ( PI.CRITERE_1_NUMERO = PC.CRITERE_NUMERO
      6             AND PC.NUMERO_CRITERE = 1
      7             AND PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
      8  and PC.TRAVAIL_COLLECTIF = 'NON'
      9  and PI.INTERVENTION_DATE >= 20100101 and PI.INTERVENTION_DATE <= 20101231
     10  group by PC.CRITERE_NUMERO
     11  order by PC.CRITERE_NUMERO;
         LEFT OUTER JOIN pmi_intervention PI
         *
    ERREUR à la ligne 4 :
    ORA-00933: La commande SQL ne se termine pas correctement
    Apparemment, probleme avec le mot LEFT

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Les jointures ANSI fontionnent en Oracle 9.2

  8. #8
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Quand j'execute, voici le message d'erreur
    SQL> SELECT PC.CRITERE_NUMERO
    2 , count(*)
    3 FROM pmi_critere PC
    4 LEFT OUTER JOIN pmi_intervention PI
    5 ON ( PI.CRITERE_1_NUMERO = PC.CRITERE_NUMERO
    6 AND PC.NUMERO_CRITERE = 1
    7 AND PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
    8 and PC.TRAVAIL_COLLECTIF = 'NON'
    9 and PI.INTERVENTION_DATE >= 20100101 and PI.INTERVENTION_DATE <= 20101231 )
    10 group by PC.CRITERE_NUMERO
    11 order by PC.CRITERE_NUMERO;
    LEFT OUTER JOIN pmi_intervention PI
    il te manquait une parenthèse en rouge
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Z3phur Voir le message
    il te manquait une parenthèse en rouge
    Merci pour tes réponses mais malheureusement, ce n'est pas çà, voici ma requete et le mesage d'erreur encore

    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
    SQL> SELECT PC.CRITERE_NUMERO
      2       , count(*) 
      3  FROM pmi_critere PC
      4       LEFT OUTER JOIN pmi_intervention PI
      5         ON    ( PI.CRITERE_1_NUMERO = PC.CRITERE_NUMERO
      6  AND PC.NUMERO_CRITERE = 1
      7  AND PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
      8  and PC.TRAVAIL_COLLECTIF = 'NON'
      9  and PI.INTERVENTION_DATE >= 20100101 and PI.INTERVENTION_DATE <= 20101231)
     10  group by PC.CRITERE_NUMERO
     11  order by PC.CRITERE_NUMERO;
         LEFT OUTER JOIN pmi_intervention PI
         *
    ERREUR à la ligne 4 :
    ORA-00933: La commande SQL ne se termine pas correctement

    Meme si j'enleve le critere de sélection des dates et autres motifs, cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> SELECT PC.CRITERE_NUMERO
      2       , count(*) 
      3  FROM pmi_critere PC
      4       LEFT OUTER JOIN pmi_intervention PI
      5         ON    ( PI.CRITERE_1_NUMERO = PC.CRITERE_NUMERO)
      6  group by PC.CRITERE_NUMERO
      7  order by PC.CRITERE_NUMERO;
         LEFT OUTER JOIN pmi_intervention PI
         *
    ERREUR à la ligne 4 :
    ORA-00933: La commande SQL ne se termine pas correctement

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous est certain que c'est une base Oracle 9.2 ? Affichez le banner du sqlplus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL*Plus: Release 10.2.0.4.0 - Production on Mer. Févr. 23 13:53:44 2011
     
    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
     
     
    Connecté à :
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL>

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Vous est certain que c'est une base Oracle 9.2 ? Affichez le banner du sqlplus
    Voila ce que je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL*Plus: Release 9.2.0.1.0 - Production on Me Fev 23 13:52:58 2011
     
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
     
     
    Connecté à :
    Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
    With the Partitioning option
    JServer Release 8.1.7.0.0 - Production
     
    SQL>

  12. #12
    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
    Connecté à :
    Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
    Vous avez votre réponse !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Salut à tous et merci pour vos réponses.

    En fait, j'ai eu une réponse en INTERNE qui me disait que partout où je faisais une condition sur la table PI, il me fallait le (+) donc j'ai ajouté ca comme dans l'exemple ci dessous et ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT PC.CRITERE_NUMERO,COUNT(PI.INTERVENTION_NUMERO) FROM PMI_CRITERE PC,PMI_INTERVENTION PI
    WHERE PI.CRITERE_1_NUMERO (+) = PC.CRITERE_NUMERO
    AND PC.NUMERO_CRITERE = 1
    AND PC.INTERVENANT_METIER_CODE = 'PUER_ASE'
    AND PI.INTERVENTION_DATE (+) >= 20100101 AND PI.INTERVENTION_DATE (+) <= 20101231
    AND PC.TRAVAIL_COLLECTIF = 'NON'
    GROUP BY PC.CRITERE_NUMERO
    ORDER BY PC.CRITERE_NUMERO;
    Voici les résultats

    CRITERE_NUMERO COUNT(PI.INTERVENTION_NUMERO)
    -------------- -----------------------------
    5101 298
    5102 62
    5103 47
    5104 3
    5105 2
    5106 0
    5107 204
    5108 67
    5109 8
    5110 21
    5111 200
    5112 8

    Merci pour votre aide et pour votre disponibilité

Discussions similaires

  1. [MySQL] probleme avec une requete pour max(id)
    Par spooli dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/05/2009, 08h54
  2. Probleme avec une requete sql dans VB6 pour un champ date
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2009, 08h31
  3. [weblogic 8.1][JDBC] Probleme avec une requete
    Par Sniper37 dans le forum Weblogic
    Réponses: 3
    Dernier message: 08/04/2005, 11h11
  4. probleme avec une requete full text
    Par maxxou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2005, 17h20
  5. au secour probleme avec une requete...
    Par soufiane59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/09/2003, 10h28

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