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() = 0 ne s'affiche pas


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut COUNT() = 0 ne s'affiche pas
    Bonjour
    Comme c'est le cas de plusieurs personne, je n'arrive pas a avoir la ligne quand le count() = 0.
    donc pour mieux vous illustrer ma table "BIEN" voici un appercu:

    -----ID------TRANSACTION--------TYPE----------------ETAT-----------PIECES-----------
    --------------------------------------------------------------------------------------------
    -----1-----------Vente--------Appartement---------#FFFFFF-----------F2-----------
    -----2-----------Vente--------Appartement---------#FFFFFF-----------F4-----------
    -----3-----------Vente--------Appartement---------#FFCC00-----------F2-----------
    -----4-----------Vente-----------Villa--------------#ababab-----------R+1-----------
    -----5-----------Vente--------Appartement---------#FFCC00-----------F3-----------
    -----6-----------Vente-----------Villa--------------#FFCC00-----------R+2-----------
    -----7-----------Vente--------Appartement---------#FFFFFF-----------F4-----------
    -----8-----------Vente--------Appartement---------#ababab-----------F5-----------
    -----9-----------Vente-----------Villa--------------#FFCC00-----------R+1-----------
    ----10-----------Vente--------Appartement---------#FFCC00-----------F4-----------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT CASE etat
    WHEN  '#FFFFFF'
    THEN  'appart disponibles'
    WHEN  '#9fcbef'
    THEN  'client injoignable'
    WHEN  '#FFCC00'
    THEN  'appart NON visités'
    WHEN  '#ababab'
    THEN  'Affaires annulées'
    END AS etat, COUNT(  'etat' ) AS nb
    FROM  `bien` 
    WHERE  `transaction` =  'vente'
    AND `type` =  'appartement'
    GROUP BY  `etat`
    donc après exécution de ma requette SQL voici le résultat affiché:
    ----------ETAT------------------nb--------
    -------------------------------------------
    ----appart disponibles-----------3--------
    ----appart NON visités----------3--------
    ----Affaires annulées------------1--------
    et mon souait est d'avoir ce résultat: la ligne ou il y a zero éléments

    ----------ETAT------------------nb--------
    -------------------------------------------
    ----appart disponibles-----------3--------
    ----client injoignable-------------3--------
    ----appart NON visités-----------1--------
    ----client injoignable------------0--------
    je vous remercie

  2. #2
    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 388
    Points
    18 388
    Par défaut
    Il vous faut une table de références pour vos états, vous pourrez ainsi faire une jointure externe avec cette table.

    En attendant vous pouvez passer par une vue dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      select et.nm_etat, count(*)
        from bien bi
             right outer join (
             select '#FFFFFF' as cd_etat, 'appart disponibles' as nm_etat union all
             select '#9fcbef'           , 'client injoignable'            union all
             select '#FFCC00'           , 'appart NON visités'            union all
             select '#ababab'           , 'Affaires annulées' ) as et
               on et.cd_etat = bi.etat
              and transaction = 'vente'
              and type = 'appartement'
    group by et.nm_etat;

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Dans une base de données vous trouverez ce que vous y mettez. Si l'information n'y figure pas vous ne la trouverez pas. SQL Ce n'est pas de la magie !!!

    Donc, effectivement il faut que cette information figure dans votre base d'une manière quelconque, le mieux étant effectivement d'avoir une table de référence et de faire une jointure externe gauche pour comptabiliser le 0.

    A +

  4. #4
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il vous faut une table de références pour vos états, vous pourrez ainsi faire une jointure externe avec cette table.

    En attendant vous pouvez passer par une vue dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      select et.nm_etat, count(*)
        from bien bi
             right outer join (
             select '#FFFFFF' as cd_etat, 'appart disponibles' as nm_etat union all
             select '#9fcbef'           , 'client injoignable'            union all
             select '#FFCC00'           , 'appart NON visités'            union all
             select '#ababab'           , 'Affaires annulées' ) as et
               on et.cd_etat = bi.etat
              and transaction = 'vente'
              and type = 'appartement'
    group by et.nm_etat;
    Je viens de créer la table ETAT(id_etat,cd_etat,nm_etat) et j'ai essayer votre requete mais elle me donne le meme resultat que la mienne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT etat.nm_etat, count(*)
        FROM bien
             RIGHT OUTER JOIN (
             SELECT '#FFFFFF' AS cd_etat, 'appart disponibles' AS nm_etat union ALL
             SELECT '#9fcbef'           , 'client injoignable'            union ALL
             SELECT '#FFCC00'           , 'appart NON visités'            union ALL
             SELECT '#ababab'           , 'Affaires annulées' ) AS etat
               ON etat.cd_etat = bien.etat
              WHERE transaction = 'vente'
              AND type = 'terrain'
    GROUP BY etat.nm_etat

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Évidemment : votre modèle de données est une catastrophe et votre requête plus qu'épouvantable. A ce stade mieux vaut se reconvertir en marchand de frites que de persister dans l'informatique !

    Donc voici la solution brute de décoffrage :
    1) la table des états
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T_ETAT
    (ETAT CHAR(8) NOT NULL PRIMARY KEY,
     LIBELLE VARCHAR(32));
    2) les données à mettre dans la table état
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO T_ETAT 
    VALUES ('#FFFFFF', 'appart disponibles'),
           ('#9fcbef', 'client injoignable'),
           ('#FFCC00', 'appart NON visités'),
           ('#ababab', 'Affaires annulées');
    3) la table des biens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE BIEN
    (ID             INT  NOT NULL PRIMARY KEY, 
     "TRANSACTION"  VARCHAR(8), 
     "TYPE"         VARCHAR(16), 
      ETAT          CHAR(8) FOREIGN KEY REFERENCES T_ETAT (ETAT),
      PIECES        VARCHAR(8));
    4) l'insertion des biens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO BIEN
    VALUES (1, 'Vente', 'Appartement', '#FFFFFF', 'F2'),
           (2, 'Vente', 'Appartement', '#FFFFFF', 'F4'),
           (3, 'Vente', 'Appartement', '#FFCC00', 'F2'),
           (4, 'Vente', 'Villa', '#ababab', 'R+1'),
           (5, 'Vente', 'Appartement', '#FFCC00', 'F3'),
           (6, 'Vente', 'Villa', '#FFCC00', 'R+2'),
           (7, 'Vente', 'Appartement', '#FFFFFF', 'F4'),
           (8, 'Vente', 'Appartement', '#ababab', 'F5'),
           (9, 'Vente', 'Villa', '#FFCC00', 'R+1'),
           (10, 'Vente', 'Appartement', '#FFCC00', 'F4');
    5) la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  LIBELLE, COUNT(ID) AS NOMBRE
    FROM    T_ETAT AS T1
            LEFT OUTER JOIN BIEN AS T2
                 ON T1.ETAT = T2.ETAT
    GROUP  BY LIBELLE
    6) le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LIBELLE                          NOMBRE
    -------------------------------- -----------
    Affaires annulées                2
    appart disponibles               3
    appart NON visités               5
    client injoignable               0
    A l'avenir :
    1) respectez la charte de postage : http://www.developpez.net/forums/a69...gage-sql-lire/
    2) apprenez le SQL... Mon site web comme mon bouquin peuvent vous y aider !
    3) apprenez à modélisez vos objets car là c'est une catastrophe. Ne serait ce que les colonnes de nom TYPE ou TRANSACTION qui sont des mots réservé de SQL !
    http://sqlpro.developpez.com/cours/s...age=partie1#L1
    http://sqlpro.developpez.com/cours/motsreserves/

    A +

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je suis tout a fait d’accord concernant vos remarques et je vais m'y faire tous de suite
    revenant a mon sujet, je viens te tester votre dernier code sql qui n'est pas aussi differant au precedant mais le probleme reste le meme; quand j'ai ajouté la clause WHERE ben la ligne ou il y a le 0 ne s'affiche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  LIBELLE, COUNT(ID) AS NOMBRE
    FROM    T_ETAT AS T1
            LEFT OUTER JOIN BIEN AS T2
                 ON T1.ETAT = T2.ETAT
    WHERE   t2.transaction = 'vente'
    AND       t2.type = 'appartement'
     
    GROUP  BY LIBELLE

  7. #7
    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 388
    Points
    18 388
    Par défaut
    Vous avez mal lu ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT T1.LIBELLE, COUNT(T2.ETAT) AS NOMBRE
        FROM T_ETAT AS T1
             LEFT OUTER JOIN BIEN AS T2
               ON T1.ETAT = T2.ETAT
              AND t2.transaction = 'vente'
              AND t2.type = 'appartement'
    GROUP BY T1.LIBELLE

  8. #8
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous avez mal lu ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT T1.LIBELLE, COUNT(*) AS NOMBRE
        FROM T_ETAT AS T1
             LEFT OUTER JOIN BIEN AS T2
               ON T1.ETAT = T2.ETAT
              AND t2.transaction = 'vente'
              AND t2.type = 'appartement'
    GROUP BY T1.LIBELLE
    voici le resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LIBELLE	              NOMBRE
    Affaires annulées	1
    appart disponibles	3
    appart NON visités	3
    client injoignable	1
    d'ou me sort ce 1

  9. #9
    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 388
    Points
    18 388
    Par défaut
    Déformation, là c'est moi qui ait mal recopié
    Il faut faire count( <une colonne non nulle de votre table bien>), et pas count(*).

    J'édite pour correction.

  10. #10
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Mais c'est chouette
    Merci Beaucoup Frédéric et a toi Fabien

    c'est le résultat voulu, bravo a vous tous

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

Discussions similaires

  1. [JTable] les noms des colonnes de s'affichent pas
    Par macben dans le forum Composants
    Réponses: 6
    Dernier message: 25/04/2008, 11h03
  2. COUNT() elle compte mais n affiche pas
    Par tyberium dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/09/2006, 23h09
  3. Le résultat de Print ne s'affiche pas...
    Par Red Bull dans le forum Langage
    Réponses: 9
    Dernier message: 15/06/2006, 18h56
  4. Les classes ne s'affichent pas
    Par karl3i dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 14h52
  5. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 11h30

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