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 :

Catégoriser les résultats d'un count


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Catégoriser les résultats d'un count
    Salut à tous,

    J'aimerais savoir comment catégoriser les résultats d'un count.

    *Ma requête actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT joueur.id, count(*)as compte_cartesDS
    from collections,joueur,cartes
    where joueur.id=collections.id_joueur AND collections.id_carte=cartes.id
    AND (cartes.id_rarete=21 OR cartes.id_rarete=22)
    AND joueur.action>1489359600
    AND joueur.inscription<1483225200
    AND joueur.admin=0
    group by joueur.id
    Ce résultat me donne le nombre de cartes par joueurs, mais je souhaite ensuite faire des catégories de ce nombre de cartes.
    Par exemple si le joueur a 5 cartes alors il sera dans la catégorie [3-5], si il en a 100 alors il sera dans la catégorie 50+...


    *J'ai pensé à utiliser la fonction case, mais cela ne marche pas...
    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
    SELECT joueur.id, count(*)as compte_cartesDS
    case
    when compte_cartesDS=0 then '0 cartes'
    when compte_cartesDS>0 and compte_cartesDS<=2 THEN 'Entre 1 et 2 cartes'
    when compte_cartesDS>2 and compte_cartesDS<=5 THEN 'Entre 3 et 5 cartes'
    when compte_cartesDS>5 and compte_cartesDS<=10 THEN 'Entre 6 et 10 cartes'
    when compte_cartesDS>10 and compte_cartesDS<=50 THEN 'Entre 11 et 50 cartes'
    ELSE 'Plus de 50 cartes'
    END
     from collections,joueur,cartes
     where joueur.id=collections.id_joueur AND collections.id_carte=cartes.id
     AND (cartes.id_rarete=21 OR cartes.id_rarete=22)
     AND joueur.action>1489359600
     AND joueur.inscription<1483225200
    AND joueur.admin=0
    group by joueur.id
    Il faudra au final que je compte combien il y a de joueurs dans chaque catégorie.

    Ca serait sympa si vous pouvez m'aider !

    Merci d'avance.

    Cordialement,

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    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 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Il suffit d'utiliser un CASE ou ajouter une table de catégorisation en jointure.

    A +

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    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 108
    Points : 28 420
    Points
    28 420
    Par défaut
    compte_cartesDS n'est pas connu au moment où tu l'utilise dans le case. Alors qu'en le faisant en deux étapes...
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    select  id_joueur  
        ,   case
                when compte_cartesDS = 0                 
                    then '0 cartes'
                when compte_cartesDS between 1  and 2   
                    then 'Entre 1 et 2 cartes'
                when compte_cartesDS between 3  and 5   
                    then 'Entre 3 et 5 cartes'
                when compte_cartesDS between 6  and 10  
                    then 'Entre 6 et 10 cartes'
                when compte_cartesDS between 11 and 50  
                    then 'Entre 11 et 50 cartes'
                else     'Plus de 50 cartes'
            end
    from    (   select  joueur.id   as  id_joueur
                    ,   count(*)    as  compte_cartesDS
                from    collections
                    inner join
                        joueur
                        on  joueur.id   = collections.id_joueur
                    inner join
                        cartes
                        on  cartes.id   = collections.id_carte
                where   cartes.id_rarete    in (21, 22)
                    and joueur.action       > 1489359600
                    and joueur.inscription  < 1483225200
                    and joueur.admin        = 0
                group by joueur.id
            )
    ;
    Au passage, une jointure s'écrit avec l'opérateur join et pas avec un produit cartésien

    Vérifie quand même soi tu ne pourrais pas utiliser ta solution en remplaçant compte_cartesDS par count(*) à l'intérieur du case.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup!

    Il fallait que je rajoute un alias à la requête imbriqué pour que cela fonctionne. Merci beaucoup!

    A l'école on m'a appris à faire les jointures avec un where... En me renseignant sur internet j'ai cru comprendre que c'était la même chose qu'un join niveau performance non?

    Dernière question, comment faire maintenant pour compter le nombre de personne dans chaque catégorie crée?


    PS: Désolé de ne pas avoir mis de balise pour mes codes SQL, je suis nouveau sur le forum

    Merci encore.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    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 108
    Points : 28 420
    Points
    28 420
    Par défaut
    Citation Envoyé par tomv701 Voir le message
    Il fallait que je rajoute un alias à la requête imbriqué pour que cela fonctionne.
    Désolé, je l'ai oublié.
    Mais ça fait plaisir de voir que tu as cherché un peu au lieu de poster immédiatement "ça marche pas" comme d'autres le font

    A l'école on m'a appris à faire les jointures avec un where...
    Il faudrait que tes professeurs se remettent à jour : norme SQL:1992 soit il y a 25 ans.

    En me renseignant sur internet j'ai cru comprendre que c'était la même chose qu'un join niveau performance non?
    Question régulièrement débattue sur ces forums. En résumé : lisibilité, maintenabilité, séparation entre restrictions et conditions de jointure...

    Dernière question, comment faire maintenant pour compter le nombre de personne dans chaque catégorie créée?
    il suffit de faire un regroupement par catégorie sur le résultat de la requête du message précédent.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Ah oui c'est tout con merci!
    J'avais la tête tellement dedans que je me suis éloigné de l'essentiel.
    Merci pour tous tes conseils !

    Bonne journée.

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

Discussions similaires

  1. [MySQL] Afficher 0 dans les résultats count(*)
    Par BonCev dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 13/05/2016, 07h36
  2. Problème pour afficher les résultats d'un count = 0
    Par Elninor dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/12/2014, 08h19
  3. Réponses: 4
    Dernier message: 11/07/2014, 12h55
  4. Lister tous les résultats avec un COUNT, même les NULL ?
    Par epfyffer dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/12/2012, 11h39
  5. Requête count renvoyant aussi les résultats=0
    Par Peq13 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/03/2010, 15h33

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