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

MS SQL Server Discussion :

Retourner un count = 0 quand pas de résultat


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut Retourner un count = 0 quand pas de résultat
    Salut,

    J'essaye de faire une procédure stockée (c'est pour ça que je poste dans ce forum). Je me trouve confronté à un problème de conception de requête. Je souhaite faire un select count(*) qui retournerait 0 si aucun résultat trouvé.
    Lorsque je fais cecie :
    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
    select	NB = count(*), ETAT
    from	MATABLE
    where	ETAT = '0'
    group by ETAT
    union
    select	NB = count(*), ETAT
    from	MATABLE
    where	ETAT = '1'
    group by ETAT
    union
    select	NB = count(*), ETAT
    from	MATABLE
    where	ETAT = '3'
    group by ETAT
    order by ETAT
    Me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NB          ETAT 
    ----------- ---- 
    5           0
    2           1
    Je souhaiterais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    NB          ETAT 
    ----------- ---- 
    5           0
    2           1
    0           3
    Mais je ne vois pas de myen simple de le faire.
    Avez-vous une idée?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Ceci étant dit, le comportement que vous avez est très correct. Il ne peut relever de ligne dont l'état est 3 puisqu'il n'y en a pas.

    Si vous voulez obtenir le résultat escompter, il faudrait faire un lien sur une table ayant toutes les valeurs que vous souhaitez faire apparaître. Il ne peut quand même pas les inventer.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table compteur(ETATchar(1))
    insert into compteur values('1')
    insert into compteur values('2')
    insert into compteur values('3')
    insert into compteur values('4')
     
    select compteur.ETAT , count(TOTO.*) NB
    from compteur right outer join TOTO on compteur.ETAT = Toto.ETAT
    group by ETAT
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Merci pour ta réponse. J'ai malheureusement une erreur de syntaxe près de '*'. Pourtant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select compteur.ETAT , TOTO.*
    from compteur right outer join TOTO on compteur.ETAT = TOTO.ETAT
    Fonctionne correctement.
    J'ai une BdD MS-SQL 2000 compatible 65 (6.5 je suppose).
    Cela peut-il venir de là?

  4. #4
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Un count.* me renvoie des résultats mais ne me fait pas apparaître la fameuse ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ETAT        NB          
    ----------- ----------- 
    3           0

  5. #5
    Membre expérimenté
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Par défaut
    essaies ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select TOTO.ETAT , count(Compteur.*) NB 
    from compteur right outer join TOTO on compteur.ETAT = Toto.ETAT 
    group by TOTO.ETAT
    A+

  6. #6
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Toujours l'erreur de syntaxe. Je crois que je suis bloqué de ce coté là...

  7. #7
    Membre expérimenté
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Par défaut
    excuses moi plutôt ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select TOTO.ETAT , count(Compteur.ETAT) NB 
    from compteur right outer join TOTO on compteur.ETAT = Toto.ETAT 
    group by TOTO.ETAT
    A+

  8. #8
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    j'avais obtenu ce résultat en essayant pas mal de combinaisons .
    Seulement ça me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ETAT NB          
    ---- ----------- 
    0    5
    1    2
    2    0
    Or je ne veux pas retourner l'ETAT = 2 se trouvant dans la table mais plutôt l'ETAT = 3 qui lui n'a aucune occurence dans la table.

  9. #9
    Membre expérimenté
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Par défaut
    ma dernière solution devrait te donner le bon résultat sauf si je n'ai pas saisi le contenu des deux tables et le resultat que tu désires, nous les présenter ce sera une bonne chose.

    A+

  10. #10
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Je n'ai qu'une seule table dont voici un échantillon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    COD_TAB     DATE_SAISIE              ETAT	
    ----------- ------------------------ ----	
    8           2004-12-20 14:05:02.923  0   	
    9           2004-12-20 14:05:02.923  1   	
    10          2004-12-20 14:05:02.923  2   	
    11          2004-12-20 14:05:02.923  0   	
    12          2004-12-20 14:05:02.923  0   	
    13          2004-12-20 14:05:02.923  0   	
    14          2004-12-20 14:05:02.923  0   	
    15          2004-12-20 14:05:02.923  1   	
    17          2004-12-20 14:05:02.923  2
    Je souhaite afficher le nombre d'occurences dont l'ETAT est à 0, 1 ou 3.
    n'ayant pas d'occurence ayant un ETAT = 3 je nai pas de retour, je souhaiterais donc avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ETAT NB          
    ---- ----------- 
    0    5 
    1    2 
    3    0
    Ta solution me retourne le nombre de lignes avec ETAT = 2.

    Voilà, si ça peut vous éclairer.

  11. #11
    Membre expérimenté
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Par défaut
    Comme il te la fait remarquer Fadace il faut qu'il y'ait une table où se trouvent tous les états (dont le 3 que tu veux afficher) dans notre cas c'est TOTO

    et la requête pour ne pas afficher etat=2 est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select TOTO.ETAT , count(Compteur.ETAT) NB 
    from compteur right outer join TOTO on compteur.ETAT = Toto.ETAT 
    where Toto.ETAT <>2
    group by TOTO.ETAT

    A+

  12. #12
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Je l'ai fait!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table #compteur(ETAT char(1)) 
    insert into #compteur values('0') 
    insert into #compteur values('1') 
    insert into #compteur values('2') 
    insert into #compteur values('3') 
    insert into #compteur values('4') 
     
    select TOTO.ETAT , count(#compteur.ETAT) NB 
    from #compteur right outer join TOTO on #compteur.ETAT = TOTO.ETAT 
    where TOTO.ETAT <>2 
    group by TOTO.ETAT
    me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ETAT NB          
    ---- ----------- 
    0    5
    1    2
    Je me trompe quelque part?

  13. #13
    Membre expérimenté
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Par défaut
    il y a un de mélange dans tout ceci:

    utilisant ta vrai table

    COD_TAB DATE_SAISIE ETAT
    ----------- ------------------------ ----
    8 2004-12-20 14:05:02.923 0
    9 2004-12-20 14:05:02.923 1
    10 2004-12-20 14:05:02.923 2
    11 2004-12-20 14:05:02.923 0
    12 2004-12-20 14:05:02.923 0
    13 2004-12-20 14:05:02.923 0
    14 2004-12-20 14:05:02.923 0
    15 2004-12-20 14:05:02.923 1
    17 2004-12-20 14:05:02.923 2
    je l'appellerai Tatable
    et celle que tu viens de créer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table #compteur(ETAT char(1)) 
    insert into #compteur values('0') 
    insert into #compteur values('1') 
    insert into #compteur values('2') 
    insert into #compteur values('3') 
    insert into #compteur values('4')
    et la solution que je t'ai proposé devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select #compteur.ETAT , count(tatable.ETAT) NB 
    from tatable right outer join #compteur 
     on tatable.ETAT = #compteur.ETAT 
    where #compteur.ETAT <>2 
    group by #compteur.ETAT

    A+

  14. #14
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Merci bien, le résultat est bien celui voulu.
    La requête sans le outer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select #compteur.ETAT , count(MATABLE.ETAT) NB 
    from MATABLE, #compteur
    where MATABLE.ETAT =* #compteur.ETAT
    group by #compteur.ETAT
    C'était la petite étoile qui me manquait finalement
    Encore merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2009, 11h05
  2. e.newvalues ne retourne pas de résultat
    Par amen_1919 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 12/06/2009, 16h53
  3. Erreur quand la requete ne trouve pas le résultat
    Par GeantBioHazard dans le forum Persistance des données
    Réponses: 1
    Dernier message: 19/02/2008, 14h17
  4. [Oracle] oci_num_rows ne retourne pas de résultat (0)
    Par osmoze dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/04/2006, 17h13
  5. [VB.NET] DataSet qui ne retourne pas de résultat
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/06/2004, 17h07

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