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 :

Plusieurs count dans un select


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 359
    Points : 77
    Points
    77
    Par défaut Plusieurs count dans un select
    Bonjour,

    Tout est dans la question !
    J'ai trouvé une requête sur ce forum que j'ai tenté d'adapter mais les résultats ne sont pas du tout ceux attendus...

    J'utilise la requête ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select count (pe_stop_robinson) as stop_robinson,
             count (pe_stop_smd) as stop_smd
             count (pe_stop_src) as stop_src,
             count (PE_PERSONNEL_GROUPE) as pers_groupe,
    from table1 , table2
    where table1.ID1 = table2.id1
    and (pe_stop_robinson = 'Y'
    or pe_stop_smd = 'Y'
    or pe_stop_src = 'Y'
    or PE_PERSONNEL_GROUPE = 'Y')
    mais elle me donne toujours le même résultat dans toutes les colonnes.
    J'ai essayé de jouer avec les and, or et parenthèses mais rien n'y fait.

    Au lieu d'avoir un résultat de ce type:

    stop_robinson|pe_stop_smd|pe_stop_src|PE_PERSONNEL_GROUPE
    61 | 109 | 40 | 4


    j'obtiens ce genre de résultat:

    stop_robinson|pe_stop_smd|pe_stop_src|PE_PERSONNEL_GROUPE
    61 | 61 | 61 | 61


    Quelqu'un aurait-il une idée pour afficher un volume cohérent avec chaque colonne du select + les critères demandés ?

    Merci d'avance.
    Microsoft SQL Server Management Studio v17.9.1

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    COUNT compte le nombre de valeur non NULL dans la colonne, donc le résultat obtenu est tout à fait normal, il faut utiliser CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select sum(case when pe_stop_robinson = 'Y' then 1 end) as stop_robinson,
           sum(case when pe_stop_smd = 'Y' then 1 end) as stop_smd
           sum(case when pe_stop_src = 'Y' then 1 end) as stop_src,
           sum(case when pe_personnel_groupe = 'Y' then 1 end) as pers_groupe,
      from table1 , table2
     where table1.ID1 = table2.id1

  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 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Commencez par nous dire ce que vous voulez sur le plan fonctionnel et révisez votre cours sur les jointures. L'opérateur JOIN existe depuis plus de 25 ans !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Il semble que ce que vous souhaitez faire soit quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select table1.id1
         , count (case when pe_stop_robinson = 'Y' then 1 end) as CPT1
         , count (case when pe_stop_smd      = 'Y' then 1 end) as CPT2
         , count (case when pe_stop_src      = 'Y' then 1 end) as CPT3
         , etc...
    from table1
    inner join table2
      on  table2.id1 = table1.id1
    Where ....
    group by table1.id1
    Notez l'importance du GROUP BY pour pouvoir compter !
    Notez aussi les jointures réalisées grâce à l'instruction JOIN

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ou encore, si votre SGBD la supporte, utilisez la clause FILTER.
    Comme vous ne précisez pas quel SGBD ni sa version, impossible de vous dire si ça va fonctionner. Mais c'est moins long à écrire que des CASE....
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Cela n'existe pas dans le standard SQL et cela pose des problèmes d'interprétation des NULLs . Aucune chance que cela se retrouve un jour dans les autres SGBD ! Encore une des stupidités de PostGreSQL qui, après avoir été proche de la norme SQL, s'en éloigne de plus en plus...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 359
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    COUNT compte le nombre de valeur non NULL dans la colonne, donc le résultat obtenu est tout à fait normal, il faut utiliser CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select sum(case when pe_stop_robinson = 'Y' then 1 end) as stop_robinson,
           sum(case when pe_stop_smd = 'Y' then 1 end) as stop_smd
           sum(case when pe_stop_src = 'Y' then 1 end) as stop_src,
           sum(case when pe_personnel_groupe = 'Y' then 1 end) as pers_groupe,
      from table1 , table2
     where table1.ID1 = table2.id1
    Cette formule fonctionne parfaitement.

    Merci.
    Microsoft SQL Server Management Studio v17.9.1

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Cela n'existe pas dans le standard SQL et cela pose des problèmes d'interprétation des NULLs . Aucune chance que cela se retrouve un jour dans les autres SGBD ! Encore une des stupidités de PostGreSQL qui, après avoir été proche de la norme SQL, s'en éloigne de plus en plus...

    A +
    Désolé, mais la clause FILTER est dans le standard SQL depuis 2003...
    Simplement, PostgreSQL est le seul à l'implémenter, toujours à ce jour.

    @+
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Ajouter plusieurs count dans un select
    Par filsdepub dans le forum Langage SQL
    Réponses: 9
    Dernier message: 11/04/2017, 15h14
  2. Plusieurs Count dans mon select
    Par thomfort dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2007, 17h39
  3. 3 count dans un select possible?
    Par cari dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/02/2007, 14h56
  4. [Formulaire] Comment permettre de faire plusieurs choix dans un select ?
    Par JackBeauregard dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/12/2006, 21h58
  5. PLusieurs COUNT dans une requete?
    Par haludo dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2006, 10h38

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