Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/02/2011, 12h37   #1
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 14h07   #2
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
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 : 673
Points : 773
Points : 773
Bonjour,

il faut faire une jointure externe :

Code :
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...
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 02h52   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 09h22   #4
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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 :
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 :
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.
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 09h47   #5
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
A priori le code suivant devrait marcher (je n'ai pas de jeu d'essais, je n'ai pas testé) :

Code sql :
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;
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 10h00   #6
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 10h13   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Les jointures ANSI fontionnent en Oracle 9.2
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 10h16   #8
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
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 : 673
Points : 773
Points : 773
Citation:
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...
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 12h30   #9
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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 :
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
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 13h50   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Vous est certain que c'est une base Oracle 9.2 ? Affichez le banner du sqlplus:
Code :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 13h53   #11
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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>
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h49   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Connecté à :
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
Vous avez votre réponse !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 09h21   #13
Invité de passage
 
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 0
Points : 0
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 :
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é
Quintoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h17.


 
 
 
 
Partenaires

Hébergement Web