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 :

Requête n'affiche pas les champs null


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    Points : 30
    Points
    30
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    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 : 50
    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
    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 : 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 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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    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 : 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
    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 ?

  4. #4
    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 : 50
    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
    Ok, je comprends mieux le souci. Il faut donc utiliser une jointure externe.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    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 : 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 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;

  6. #6
    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 : 50
    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
    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 ...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/06/2018, 15h14
  2. Find n'affiche pas les champs des tables jointes
    Par didjac dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 02/06/2014, 08h20
  3. [MySQL] Résultat requête au format JSON, afficher que les champs vide ou null
    Par ilanb dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/02/2014, 14h00
  4. Réponses: 1
    Dernier message: 10/09/2009, 19h20
  5. afficher les champs null de deux tables dans un select
    Par poil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/09/2005, 15h05

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