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 :

effectuer un count avec conditions


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut effectuer un count avec conditions
    Bonjour,

    Je voudrais effectuer un count un peu particulier. J'ai le tableau suivant :

    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
    16
     
    Couleur	     Nom		Valeur		Comptage
    bleu		marion		vrai		2
    bleu            vincent		vrai		2
    bleu 		marion		vrai		2
    bleu 		pierre		faux		2
    bleu 		myrtille	faux	        2
    jaune		pascal		vrai		3
    jaune		françois	vrai		3
    jaune		michèle	        faux		3
    jaune		jean		vrai		3
    jaune		michèle	        faux		3
    vert		marie		vrai		4
    vert		pierre		vrai		4
    vert		vincent		vrai		4
    vert		manon		vrai		4
    Je voudrais compter le nombre de « Valeur » = vrai pour chaque couleur, mais en ne prenant en compte qu’une fois chaque prénom par couleur.
    Exemple avec la couleur « bleu » :
    il y a 5 lignes :
    trois lignes à « vrai »
    deux lignes à « faux»
    4 prénoms.
    Je voudrais donc que dans ce cas de figure ma requête me retourne la valeur comptage = 2 pour la couleur bleu (en comptant vincent et en ne prenant en compte qu'une fois le "vrai" de marion qui apparaît 2 fois).

    J’arrive à effectuer le count dans un cas simple comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Couleur	             Nom		Valeur
    bleu		marion		vrai
    bleu            vincent		vrai
    jaune		pascal		vrai
    jaune		françois	vrai
    jaune		jean		vrai
    vert		marie		vrai
    vert		pierre		vrai
    vert		vincent		vrai
    vert		manon		vrai
    grâce au code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    proc SQL;
    create table analyse as
    select *, count(valeur) as comptage
    from ma_table
    where valeur = "vrai"
    group by Couleur;
    J’obtiens ainsi la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Couleur	            Nom		Valeur		Comptage
    bleu		marion		vrai		2
    bleu          vincent		vrai		2
    jaune		pascal		vrai		3
    jaune		françois	vrai            3
    jaune		jean		vrai		3
    vert		marie		vrai		4
    vert		pierre		vrai		4
    vert		vincent		vrai		4
    vert		manon		vrai		4
    Merci d’avance de votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Pas sûr d'avoir bien compris le besoin mais cette requête conviendrait-elle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Couleur, COUNT(DISTINCT Nom) AS Nb_vrai
    FROM ma_table
    WHERE Valeur = 'vrai'
    GROUP BY Couleur
    Elle est censée compter le nombre de 'Nom' différents (donc une seule fois chaque Nom) pour chaque couleur avec la valeur 'vrai'.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Merci de la réponse CinePhil,

    Ta requête effectue le bon comptage, sauf que le problème est qu'elle fait un filtre sur les valeurs = "vrai" et supprime les autres lignes.
    Ce que j'aimerais, c'est aussi garder les autres lignes...

    ex : pour la couleur bleue :
    ta requête renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Couleur	     Nom		Valeur		Comptage
    bleu		marion		vrai		2
    bleu            vincent		vrai		2
    bleu 		marion		vrai		2
    alors que j'aimerais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Couleur	     Nom		Valeur		Comptage
    bleu		marion		vrai		2
    bleu            vincent		vrai		2
    bleu 		marion		vrai		2
    bleu 		pierre		faux		2
    bleu 		myrtille	faux	        2
    Est-il possible de faire une requête imbriquée pour obtenir ce résultat ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par tibss Voir le message
    Ta requête effectue le bon comptage, sauf que le problème est qu'elle fait un filtre sur les valeurs = "vrai" et supprime les autres lignes.
    Ce que j'aimerais, c'est aussi garder les autres lignes...
    Ce n'était pas ta demande de départ !
    Je voudrais compter le nombre de « Valeur » = vrai pour chaque couleur,
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Couleur, Nom, Valeur, COUNT(DISTINCT Valeur) AS Comptage
    FROM ma_table
    GROUP BY Couleur, Nom, Valeur
    Au passage, ma précédente requête ne pouvait pas retourner ce que tu annonces parce qu'elle n'affiche ni la colonne Nom ni la colonne Valeur !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je vais prendre un autre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Couleur	     Nom		Valeur		
    bleu		marion		vrai
    bleu            vincent		vrai
    bleu 		marion		vrai
    bleu 		pierre		faux
    bleu 		myrtille	faux
    bleu                    françois               vrai
    bleu                    pierre                  vrai
    bleu                    françois               vrai
    Je voudrais compter le nombre de "vrai" pour la couleur bleue en ne prenant qu'une fois en compte un nom donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Couleur	     Nom		Valeur		Comptage
    bleu		marion		vrai		4
    bleu            vincent		vrai		4
    bleu 		marion		vrai		4
    bleu 		pierre		faux		4
    bleu 		myrtille	faux	        4
    bleu                    françois               vrai                     4
    bleu                    pierre                  vrai                     4
    bleu                    françois               vrai                     4
    bleu		marion		vrai		4
    Je ne suis pas sur que ta requête permette d'effectuer ce calcul

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à comprendre ta demande !
    Tu veux compter les vrai mais garder toutes les lignes de la table ?

    Je voudrais compter le nombre de "vrai" pour la couleur bleue en ne prenant qu'une fois en compte un nom donné
    Ça c'était ma première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Couleur, COUNT(DISTINCT Nom) AS Nb_vrai
    FROM ma_table
    WHERE Valeur = 'vrai'
    GROUP BY Couleur
    Si tu veux garder toutes les lignes de ta table dans le résultat et y ajouter le comptage, il faut faire une jointure entre la table et la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.Couleur, t1.Nom, t1.Valeur, t2.Comptage
    FROM ma_table AS t1
    INNER JOIN (
      SELECT Couleur, COUNT(DISTINCT Nom) AS Nb_vrai
      FROM ma_table
      WHERE Valeur = 'vrai'
      GROUP BY Couleur
    ) AS t2 ON t1.Couleur = t2.Couleur
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Merci de cette information,

    J'ai seulement remplacé le inner join par un left outer join, et tout fonctionne parfaitement !
    Je faisais jusqu'à présent une jointure sous SAS, et je ne savais pas comment capitaliser tous ces retraitements en une seule requête SQL. Merci pour ton aide CinePhil !

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

Discussions similaires

  1. multiple count avec condition
    Par psgman113 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/08/2011, 12h00
  2. Count avec condition
    Par sherpa421 dans le forum iReport
    Réponses: 1
    Dernier message: 20/11/2009, 11h54
  3. Count avec condition
    Par ElBarto38 dans le forum SQL
    Réponses: 5
    Dernier message: 05/11/2009, 15h56
  4. Réponses: 1
    Dernier message: 22/12/2008, 10h15
  5. Count avec condition
    Par sourivore dans le forum Langage SQL
    Réponses: 24
    Dernier message: 22/08/2005, 22h41

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