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 :

max(count(*)) avec un GROUP BY


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut max(count(*)) avec un GROUP BY
    Bonjour,
    Je travaille en Oracle 10.
    j'ai la table TABLE suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ID  POINT    USED
    -- -------   ------
    1   ABATI    Y
    2   NOREL    Y
    3   NOREL    Y
    4  ABATI     N
    5  NOREL    Y
    Je voudrais connaitre le POINT qui apparait le plus avec la valeur USED=Y
    j'ai écrit la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(count(*)) from TABLE where USED='Y' GROUP BY POINT
    et j'obtiens 3 ce qui est bon.

    Là ou je cale, c'est pour obtenir en même temps la valeur du POINT correspondant, car si je fait "select POINT,max(count(*)) ... " j'ai bien sur le message not a single-group group function sur POINT

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Je suis déjà étonné que MAX(COUNT(*)) soit accepté... mais c'est peut être une spécificité d'Oracle.

    Avec les fonctions de regroupement analytiques, j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  point
    FROM
        (   SELECT  point
                ,   cnt
                ,   MAX(cnt) OVER() AS maxi
            FROM
                (   SELECT  point
                        ,   COUNT(*) AS cnt
                    FROM    matable
                    GROUP BY point
                )   AS tmp2
        )   AS tmp2
    WHERE   cnt = maxi
    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
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    ... mais c'est peut être une spécificité d'Oracle

    Je pensais que SQL était standard, et donc portable.

    Au sujet de ta requète, je n'ai pas tout compris ...
    la clause OVER() est nécessaire sinon j'ai une erreur "not a single-group group function" sur point, mais je ne comprends pas son role.
    J'ai des erreurs de parenthèsage avec les clauses as temp2 et je les ai virées.
    En final, j'ai la requète suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  point
    FROM
        (   SELECT  point
                ,   cnt
                ,   MAX(cnt) OVER() AS maxi
            FROM
                (   SELECT  point,   COUNT(*) AS cnt
                    FROM    matable
                    GROUP BY point
                )  
        ) 
    WHERE   cnt = maxi
    qui marche très bien, et l'utilisation de la clause AS, que je n'utilisais que pour de la présentation, m'ouvre de nouvelles perspectives
    Donc mille fois merci

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Je pensais que SQL était standard, et donc portable.
    Il existe en effet une norme pour le langage SQL (dernière version ANSI-2003) mais les éditeurs n'implémentent pas toutes les fonctionnalités prévues et/ou y ajoutent leur propres extensions.

    Citation Envoyé par awalter1 Voir le message
    la clause OVER() est nécessaire sinon j'ai une erreur "not a single-group group function" sur point, mais je ne comprends pas son role.
    Je te renvoie à la documentation de ton SGBD pour que tu y découvres toutes les possibilités des fonctions analytiques de regroupement.
    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.

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

Discussions similaires

  1. Requete select count(*) avec having max()
    Par Goupo dans le forum Langage SQL
    Réponses: 10
    Dernier message: 09/03/2009, 12h50
  2. Max d'un count avec alias
    Par bsquare09 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 18/11/2008, 14h07
  3. row count avec group dans crosstab
    Par lapin_hobbit dans le forum Jasper
    Réponses: 0
    Dernier message: 16/07/2008, 09h28
  4. Requête group by + max(count())
    Par Wonesek dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/06/2008, 14h50
  5. max(count(*)) avec un GROUP BY (suite)
    Par awalter1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/09/2007, 15h07

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