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 :

Problème requête SQL (HAVING COUNT / MAX)


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème requête SQL (HAVING COUNT / MAX)
    Bonsoir,

    J'ai un petit problème concernant une requête, je n'arrive pas à la finir. Voici le problème : Quel(s) membre(s) cumule(nt) le plus de changement d’abonnement (nom, nombre de
    changement) ?

    Mon modèle relationnel :
    ABONNER (CodeAbo*,NumM*, DateDebut, DateFin)
    MEMBRE (NumM, NomM, PrenomM, AdresseM, VilleM, DateDeNaissanceM, NumS*)

    Et voilà ce que j'ai essayé de faire pour la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Count(ABONNER.NumM) AS nbchangement, NomM
    FROM ABONNER, MEMBRE
    WHERE ABONNER.NumM=MEMBRE.NumM
    GROUP BY ABONNER.NumM, NomM

    le soucis c'est que ça affiche la liste de tous les membres avec le nombre de changement pour chacun. Pour afficher le membre qui a le plus de changement, il me semble qu'il faudrait faire un having count = select max (qqchose) mais je n'arrive pas à l'écrire.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Sans connaître le SGBD utilisé ni sa version, je répondrai en utilisant les fonctions de regroupement fenêtrées qui permettent de résoudre cela très facilement :
    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
    WITH    cnt
            AS  (   SELECT  abo.numm
                        ,   COUNT(*)    AS nbabo
                    FROM    abonner abo
                    GROUP BY abo.numm
                )
        ,   sel
            AS  (   SELECT  LAST_VALUE(cnt.numm) OVER (ORDER BY cnt.nbabo ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                    FROM    cnt
                )
    SELECT  mbr.nomm
    FROM    membre  mbr
        INNER JOIN
            sel
            ON  cnt.numm  = mbr.numm
    ;
    Avec un SGBD qui ne connait pas ces fonctions ni l'usage des CTE, cela sera un peu plus complexe... mais à peine.

  3. #3
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Pour compléter le propos d’al1_24.

    Si le SGBD ne connaît ni les CTE (Common Table Expression) ni les fonctions sophistiquées, on peut procéder ainsi (méthode bourrin), en respectant la norme SQL:1992 (je détaille les composants de la requête finale (R4)) :


    (R1) Comptage des changements d’abonnement par membre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NumM, COUNT(*) AS Kount
    FROM   ABONNER
    GROUP BY NumM ;

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NumM   Kount
    ----   -----
    m01        3
    m02        4
    m03        2
    m04        1
    m05        4
    Manifestement les membres m02 et m05 répondent à la question posée.


    (R2) Recherche du plus grand nombre de changements d’abonnement :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MAX(Kount)
    FROM   (
            SELECT COUNT(*) AS Kount
            FROM   ABONNER
            GROUP BY NumM
           ) AS x ;

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MAX(Kount)
    ----------
             4

    (R3) Recherche des membres pour lesquels le nombre de changements d’abonnement est égal à MAX(Kount). Pour cela on tricote les deux requêtes précédentes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT NumM, Kount
    FROM   (
            SELECT NumM, COUNT(*) AS Kount
            FROM   ABONNER
            GROUP BY NumM
           ) AS x
    WHERE  Kount = (SELECT  MAX(Kount)
                    FROM   (
                            SELECT NumM, COUNT(*) AS Kount
                            FROM   ABONNER
                            GROUP BY NumM
                           ) AS truc
                   )
    GROUP BY NumM ;

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NumM    Kount
    ----    -----
    m02         4
    m05         4

    (R4) Pour la requête finale (jointure avec la table MEMBRE) :

    Code SQL : 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 NomM, Kount
    FROM   (
            SELECT NumM, COUNT(*) AS Kount
            FROM   ABONNER
            GROUP BY NumM
           ) AS x
    JOIN MEMBRE AS y ON x.NumM = y.NumM  
    WHERE  Kount = (SELECT  MAX(Kount)
                    FROM   (
                            SELECT NumM, COUNT(*) AS Kount
                            FROM   ABONNER
                            GROUP BY NumM
                           ) AS truc
                   )
    GROUP BY x.NumM
    ;

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NomM     Kount
    ----     -----
    Bernard      4 
    Emile        4

Discussions similaires

  1. Problème requête SQL COUNT
    Par 30avril1989 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/06/2010, 13h55
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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