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
    Nouveau membre du 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
    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 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 132
    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.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    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 162
    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
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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