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 :

count null zero


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut count null zero
    Bonjour à tous,
    Je sais que ce sujet a déjà été traité dans d'autres post mais les solutions apportées ne m'aide pas beaucoup.

    Je vous explique mon cas (l'exemple est fictif):

    suivi
    id_eleve___ : 1234 1234 1234 5678 5678
    id_ecole___ : 1111 2222 3333 1111 2222
    provenance : BAC BAC DESS BEPC CAP

    inscription
    id_eleve______ : 1234 1234 5678
    id_ecole______ : 1111 2222 1111 ....
    date_inscription : 01/01/2006 01/01/2006 01/01/2006

    traitement
    id_eleve______ : 1234 5678
    date_inscription : 01/01/2006 01/01/2006

    La table de traitement m'indique tous les élèves sur lequel porte mon traitement
    La table d'inscription permet de récupérer les id_ecole me permettant de récupérer les enregistrements correspondant dans la table suivi

    Mon but est de comptabiliser le nombre d'inscription pour une certaine provenance pour les élèves et la date d'inscription de la table traitement
    j'ai donc créer une requête ensembliste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct(T.id_eleve), nvl(count(*),0) as nb
    from inscription I, suivi S, traitement T 
    where I.id_eleve=S.id_eleve
          and I.id_ecole=S.id_ecole
          and  I.id_eleve=T.id_eleve(+)
          and I.date_inscription=T.date_inscription
          and S.provenance='BAC'
          group by T.id_eleve
    Cette requête me renvoi le résultat :
    id_eleve | nb
    1234 | 2


    alors que je voudrais :
    id_eleve | nb
    1234 | 2
    5678 | 0


    Avez vous une idée pour récupérer le nombre d'inscription même s'il les valeurs sont nulles?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Merci de préciser votre SGBD (Oracle ?) et sa version.
    D'autre part, pouvez-vous essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT(T.id_eleve), nvl(count(*),0) AS nb
    FROM inscription I, suivi S, traitement T 
    WHERE I.id_eleve=S.id_eleve
          AND I.id_ecole=S.id_ecole
          AND  I.id_eleve=T.id_eleve(+)
          AND I.date_inscription=T.date_inscription(+) -- changement ici !
          AND S.provenance='BAC'
          GROUP BY T.id_eleve

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    j'utilise oracle 10.2

    et pour la modification : ça ne change rien toujours qu'un résultat

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Oui effectivement j'avais lu trop vite.
    En regardant de plus près, avec votre modélisation actuelle votre demande me semble difficilement réalisable.
    Si possible, modifiez la modélisation de vos données.

  5. #5
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,
    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT T.id_eleve, count(*) nb
    FROM traitement T 
         left join (select i.id_eleve, i.id_ecole, date_inscription from inscription I inner join suivi S on i.id_eleve = s.id_eleve and i.id_ecole = s.id_ecole where S.provenance='BAC') i_s
           on T.id_eleve = i_s.id_eleve and T.date_inscription = i_s.inscription
    GROUP BY T.id_eleve
    Remarque :
    Etant donné que "traitement" défini votre périmètre, les jointures externes sont à l'envers dans votre requête

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    En fait la base que j'utilise n'est pas en 10.2 mais
    Oracle8 Enterprise Edition Release 8.0.6.3.0 (la migration en 10 n'a pas encore été réalisée, elle le sera d'ici peu)
    Et j'utilise le client : PL/SQL Release 8.0.6.3.0

    du coup mon compilateur n'accepte pas la syntaxe
    FROM traitement T
    LEFT JOIN
    qu'elle est la syntaxe équivalente?

  7. #7
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Citation Envoyé par jilham
    En fait la base que j'utilise n'est pas en 10.2
    Piégé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT T.id_eleve, count(*) nb
    FROM traitement T,
         (SELECT i.id_eleve, i.id_ecole, date_inscription 
            FROM inscription I, suivi S 
            where i.id_eleve = s.id_eleve 
              AND i.id_ecole = s.id_ecole 
              AND S.provenance='BAC') i_s
    WHERE
         T.id_eleve = i_s.id_eleve(+)
     AND T.date_inscription = i_s.inscription(+)
    GROUP BY T.id_eleve

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    oui désolé pour la mauvaise information,

    la syntaxe est acceptée,
    par contre la requête est super lourde car la jointure entre inscription et suivi comprend des milliers d'enregistrements...
    La ça fait + de 4 minutes d'éxécution.

    Y aurait-il moyen de l'optimiser?


    le résultat me renvoi en effet 2 enregistrements c'est cool,
    par contre il me met 1 au lieu de 0 et cela doit être a cause du count (*) qui compte le nombre de lignes et non pas le nombre de valeurs

    merci

  9. #9
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Peut-être en factorisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with i_s as 
    (SELECT i.id_eleve, i.id_ecole, date_inscription 
            FROM inscription I, suivi S 
            WHERE i.id_eleve = s.id_eleve 
              AND i.id_ecole = s.id_ecole 
              AND S.provenance='BAC')
    SELECT T.id_eleve, count(i_s.id_eleve) nb
    FROM traitement T,
             i_s
    WHERE
         T.id_eleve = i_s.id_eleve(+)
     AND T.date_inscription = i_s.inscription(+)
    GROUP BY T.id_eleve

  10. #10
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Arrgh désolé .. ça doit pas passer en 8i ça ...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    effectivement ça ne passe pas en 8i
    par contre dans la logique de la requête
    on crée une table temporaire correspondant au produit cartésien de inscription et suivi et ensuite on fait un select à partir des valeurs de traitement.

    Ne pourrait-on pas faire une seule requête avec 3 tables dans le from qu'on lie par jointure?
    ça devrait prendre moins de temps non?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Ok je viens de me renseigner et la base a migré en 10.2 ce week end
    la j'étais en train de travailler sur l'ancienne base de test.
    Je vais essayer la dernière solution sur la nouvelle instance et je vous tiendrai au courrant

    merci beaucoup en tout cas

  13. #13
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Votre schéma vous contraint à utiliser une sous-requête.
    Ceci devrait aller un peu plus vite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT T.id_eleve, sum(nvl(nb,0)) nb
    FROM traitement T,
         (SELECT i.id_eleve, date_inscription, count(i.id_ecole) nb
            FROM inscription I, suivi S 
            WHERE i.id_eleve = s.id_eleve 
              AND i.id_ecole = s.id_ecole 
              AND S.provenance='BAC'
            group by i.id_eleve, date_inscription) i_s
    WHERE
         T.id_eleve = i_s.id_eleve(+)
     AND T.date_inscription = i_s.inscription(+)
    GROUP BY T.id_eleve

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    merci chrifo
    problème résolu

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

Discussions similaires

  1. [SQL] Affichage des valeurs nulles dans un Count
    Par at_first dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2007, 11h07
  2. mettre des Zero a tous les champ null d'un coup
    Par LesLemmings dans le forum Access
    Réponses: 3
    Dernier message: 14/06/2006, 09h34
  3. Comment faire un count de colonnes null
    Par claralavraie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2006, 14h13
  4. COUNT(*) = NULL!!!!
    Par jnstaub dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/01/2006, 10h14
  5. Afficher le résultat d'un COUNT même null
    Par Invité dans le forum Langage SQL
    Réponses: 10
    Dernier message: 18/11/2005, 18h07

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