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 :

Compter des éléments selon une condition


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Compter des éléments selon une condition
    Hello,

    J'ai une table qui contient des données sous la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Col1 | Col2 | Col3
    1    | A    | F
    2    | B    | G
    3    | A    | G
    4    | A    | G
    Je souhaite récupérer les informations suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Type Col3 | Nb A | Nb B
    F         | 1    | 0
    G         | 2    | 1
    Avez-vous une idée de la manière la plus simple de procéder?

    Merci pour votre aide.


  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    tu as commencé quelque chose?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Je pensais utiliser un GROUP BY mais je ne sais pas comment lui spécifier les conditions en sur les COUNT...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
        Col3 AS Type,
        Count(...),
        Count(...)
    FROM TABLE
    GROUP BY
        Col3

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il faut jouer sur les conditions (case ... when ... then ... else ... end)
    si ta valeur vaut la lettre que tu veux, tu ajoutes 1 sinon tu ajoutes 0), donc cela sera plus un sum() qu'il faut utiliser

    ce qui devrait donner quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select col3,
    sum(case col2 when 'A' then 1 else 0 end) as 'Nb A',
    sum(case col2 when 'B' then 1 else 0 end) as 'NB B'
    from taTable
    group  by col3

  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 394
    Points
    18 394
    Par défaut
    Attention, ce que vous faites d'appelle un pivot :
    si c'est certes possible en SQL sachez que c'est limité (le nombre de colonnes en sortie doit être connue à l'avance) et qu'en plus vous allez vous prendre une cosmétiqualerte !

    Je pourrai vous donner la solution mais vous avez l'air chercheur alors je vous donne une piste.

    Disons que vous pourriez compter 1 si le groupe vaut A, null sinon.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    il faut jouer sur les conditions (case ... when ... then ... else ... end)
    si ta valeur vaut la lettre que tu veux, tu ajoutes 1 sinon tu ajoutes 0), donc cela sera plus un sum() qu'il faut utiliser

    ce qui devrait donner quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select col3,
    sum(case col2 when 'A' then 1 else 0 end) as 'Nb A',
    sum(case col2 when 'B' then 1 else 0 end) as 'NB B'
    from taTable
    group  by col3
    Cette requête n'a d'intérêt que si seules les valeurs A et B peuvent être trouvées dans la table. Pour ajouter des colonnes au résultat, il faudra ajouter des expressions dans la requête. Il n'y a rien de dynamique...

    Mieux vaut utiliser la requête suivante et faire la mise en forme à partir de l'application cliente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  col3
        ,   col2
        ,   count(*) AS nb
    FROM    matable
    GROUP BY col3
        ,   col2
    ORDER BY col3
        ,   col2

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    En fait c'est bon, je connais les valeurs.
    Par contre j'ai utilisé des IF.

    Merci.


  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Même problématique mais dans ce cas on ne connais pas le contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Ref1 | Ref2 | Ref3 
    A    |      |      
    A    | B    |      
    B    |      |      
    C    |      |
    Les références sont stockées dans l'ordre d'apparition.

    Je souhaite lister l'ensemble des références disponibles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Ref1 | Ref2 | Ref3 | Nb1  | Nb2  | Nb3 
    A    | B    | C    | 2    |  2   | 1

  9. #9
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    tu n'auras pas l'affichage que tu veux dans ton exemple mais tu peux faire une requête de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select ref, count(*)
    from (
    select ref1 as ref from taTable
    UNION ALL
    select ref2 as ref from taTable 
    UNION ALL
    select ref3 as ref from taTable
    ) tmp
    group by ref

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

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 23h07
  2. Colorer des points selon une condition
    Par RTK45 dans le forum R
    Réponses: 5
    Dernier message: 06/05/2014, 12h38
  3. [XL-2007] Compter des cellules, avec une condition
    Par OccitaL dans le forum Excel
    Réponses: 6
    Dernier message: 17/06/2010, 16h15
  4. [XL-2003] Compter les occurences selon une condition sur une autre colonne
    Par juvamine dans le forum Excel
    Réponses: 4
    Dernier message: 13/05/2009, 12h08
  5. Compter des éléments d'une liste
    Par Mantor dans le forum Prolog
    Réponses: 5
    Dernier message: 02/05/2007, 19h40

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