Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 04/03/2011, 09h50   #1
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Par défaut Requête n'affiche pas les champs null

Bonjour,

Quelqu'un peut m'aider ?
J'ai un problème avec une requête, elle ne m'affiche que les champs renseignés : si un champs est null elle ne l'affiche pas, hors je voudrais qu'elle affiche 0 quand c'est null.

Code :
1
2
3
4
5
6
7
8
9
10
 SELECT	COUNT(DISTINCT E.iets)  FROM r_etablissement E, r_histo_etats_ets H1, r_enseignement_ets C
WHERE	E.iets = H1.iets
AND	E.iets = C.iets
AND	C.icat_agr IN (SELECT icat_agr FROM  r_cat_agr ) 
AND	(C.date_deliv_ets <= '10/10/2009' OR C.date_deliv_ets IS NULL)
AND	H1.ietat IN (2,3,4,7)
AND	H1.date_effet_ets IN (SELECT MAX(date_effet_ets) FROM r_histo_etats_ets H2
WHERE	H1.iets = H2.iets
AND	H2.date_effet_ets <= '10/10/1990' )
AND  E.idep = '01' GROUP BY icat_agr;
Le résultat :
Code :
1
2
3
4
5
6
7
8
9
10
COUNT(DISTINCT E.iets) 
60
114
7
4
7
16
72
1
114
Il manque un champ 0 elle ne me l'affiche pas.
souf_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 11h04   #2
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
La jointure entre les tables n'est pas externe, donc si iets, icat_agr ou tout autre paramètre évoqué dans la clause where est nul, il n'est pas remonté.

La clause group by portant sur icat_agr ses nulls ne sont pas comptabilisés.

La solution pour prendre en compte les nulls serait donc la suivante :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT COUNT(DISTINCT E.iets) 
FROM r_etablissement E
   , r_histo_etats_ets H1
   , r_enseignement_ets C
WHERE E.iets = H1.iets
  AND E.iets = C.iets
  AND ( C.icat_agr IN (SELECT icat_agr FROM r_cat_agr )
     OR C.icat_agr is null )
  AND (C.date_deliv_ets <= '10/10/2009' OR C.date_deliv_ets IS NULL)
  AND H1.ietat IN (2,3,4,7)
  AND H1.date_effet_ets IN (SELECT MAX(date_effet_ets) 
                            FROM r_histo_etats_ets H2
                            WHERE H1.iets = H2.iets
                              AND H2.date_effet_ets <= '10/10/1990' )
  AND E.idep = '01' 
GROUP BY icat_agr;

Cependant, cette requête indiquera le nombre de nulls et non 0 et en supposant que SELECT icat_agr FROM r_cat_agr ne remonte pas la valeur 'null'.

La vraie question est que voulez vous faire exactement avec cette requête ?

Parceque honnêtement, remonter les comptages sans remonter la colonne de regroupement a assez peu d'intéret et me semble difficilement exploitable.
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 11h25   #3
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Merci pour votre réponse mais la condition que tu as ajoutée n'est pas importante, cette ligne je peux l'enlever carrément comme ci-dessous et j'ai le même résultat c'était juste une condition de plus qui ne sert à rien parce que icat_agr est une clé étrangère et je fais un group by sur ce champs donc ça m'affiche la même chose.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT C.icat_agr,COUNT(DISTINCT E.iets) FROM r_etablissement E, r_histo_etats_ets H1, r_enseignement_ets C
WHERE E.iets = H1.iets
AND E.iets = C.iets
AND C.icat_agr IN (SELECT icat_agr FROM r_cat_agr )
AND H1.ietat IN (2,3,4,7)
AND H1.date_effet_ets IN (SELECT MAX(date_effet_ets) FROM r_histo_etats_ets H2
WHERE H1.iets = H2.iets
AND H2.date_effet_ets <= '10/10/1990' )
AND E.idep = '01' GROUP BY icat_agr;
 
 
C.icat_agr      COUNT(DISTINCT E.iets)
1	           60
2	          114
3	           7
4	           4
5	           7
7	           16
8	           72
9	           1
10	           114
J'ai le même résultat, mais on remarque que la catégorie 6 n'existe pas parce qu'il n'y a pas d'enregistrement.
Comment afficher cette catégorie, et afficher null dans le count ?
souf_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 12h04   #4
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
Ok, je comprends mieux le souci. Il faut donc utiliser une jointure externe.

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT nvl(COUNT(DISTINCT E.iets),0)
FROM r_etablissement E
   , r_histo_etats_ets H1
   , r_enseignement_ets C
WHERE E.iets = H1.iets
  AND E.iets(+)= C.iets 
  AND C.icat_agr IN (SELECT icat_agr FROM r_cat_agr
  AND (C.date_deliv_ets <= '10/10/2009' OR C.date_deliv_ets IS NULL)
  AND H1.ietat IN (2,3,4,7)
  AND H1.date_effet_ets IN (SELECT MAX(date_effet_ets) 
                            FROM r_histo_etats_ets H2
                            WHERE H1.iets = H2.iets
                              AND H2.date_effet_ets <= '10/10/1990' )
  AND E.idep = '01' 
GROUP BY icat_agr;
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 14h13   #5
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
Il faut aussi changer la jointure entre E et H1, sinon la jointure externe saute.
On doit probablement pouvoir la remplacer par E par C, attention ce point est à vérifier.

Au passage les jointures ANSI ne feront pas de mal :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  SELECT R.icat_agr, COUNT(DISTINCT E.iets)
    FROM r_cat_agr R 
         INNER JOIN r_enseignement_ets C
           ON C.icat_agr = R.icat_agr
         INNER JOIN r_histo_etats_ets H1
           ON H1.iets = C.iets
         LEFT OUTER JOIN r_etablissement E
           ON E.iets = C.iets
          AND E.idep = '01'
   WHERE (C.date_deliv_ets <= to_date('10/10/2009', 'dd/mm/yyyy') OR C.date_deliv_ets IS NULL)
     AND H1.ietat IN (2,3,4,7)
     AND H1.date_effet_ets = (SELECT MAX(date_effet_ets) 
                                FROM r_histo_etats_ets H2
                               WHERE H2.iets = H1.iets
                                 AND H2.date_effet_ets <= to_date('10/10/1990', 'dd/mm/yyyy'))
GROUP BY R.icat_agr;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 14h24   #6
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
Citation:
Envoyé par Waldar Voir le message
Il faut aussi changer la jointure entre E et H1, sinon la jointure externe saute.
On doit probablement pouvoir la remplacer par E par C, attention ce point est à vérifier.
On peut en effet remplacer E par C l'optimiseur fait automatiquement la fermeture transitive.

Et en effet il faut changer la jointure entre E et H1


Citation:
Envoyé par Waldar Voir le message
Au passage les jointures ANSI ne feront pas de mal
Si on est dans une version d'oracle qui le supporte. N'ayant pas la version ...
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 17h11   #7
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Merci bcp pour votre réponse
mais rien tjrs pas, ça reste comme ça le meme affichage.sans les valeur null avec jointure ou non
souf_87 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 15h45.


 
 
 
 
Partenaires

Hébergement Web