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

SQL Firebird Discussion :

Ligne réalisant le MAX


Sujet :

SQL Firebird

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Ligne réalisant le MAX
    Bonjour,

    Voici la requête qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT name, MAX(total) FROM(
    SELECT D.nom as name, SUM(C.pop) AS total FROM
    communes C JOIN departements D
    ON C.dep = D.id
    GROUP BY D.nom)
    Il s'agit de deux tables contenant les infos sur les communes françaises, ainsi que les départements.
    Je souhaite obtenir le département ayant la plus grande population. Je regroupe les communes par département, je somme leurs populations, ce qui me donne la population de chaque département. Dans la requête interne, j'ai donc deux colonnes avec nom de département et population correspondante. Cette requête fonctionne, je l'ai testé à part.
    Ce que je ne comprends pas, c'est que lors de l'exécution de la requête ci-dessus, le nom de département retourné ne correspond pas au max !!
    Il y quelque chose qui m'échappe, mais je ne vois pas.
    Une idée ?
    Merci d'avance.

  2. #2
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je suis arrivé à mes fins avec cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM (SELECT MAX(somme) as maxi FROM(
    (SELECT SUM(C.pop) as somme
    FROM communes C, departements D
    WHERE C.dep = D.id
    GROUP BY D.nom))) M, (SELECT D.nom as name, SUM(C.pop) as somme
    FROM communes C, departements D
    WHERE C.dep = D.id
    GROUP BY D.nom) T
    WHERE T.somme = M.maxi
    Mais je trouve cela horriblement compliqué. Y a-t-il une procédure standard pour obtenir les lignes réalisant un max ? J'ai lu dans certaines documentation que la fonction MAX réalisait cela, mais ça ne fonctionne pas avec mon code ...

    Merci pour tout éclaircissement ...

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Comme ceci peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
        D.nom AS name, 
        SUM(C.pop) AS total 
    FROM communes C 
    JOIN departements D
        ON C.dep = D.id
    GROUP BY D.nom
    ORDER BY SUM(C.pop) DESC
    ROWS 1

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse. Oui, l'idée est sympathique. Le code ne fonctionne pas chez moi tel quel. Je ne connais pas l'utilisation de ROWS. Es-tu certain de la syntaxe proposée ?
    Ceci soulève la question suivante : s'il y a un nombre indéfini de lignes réalisant le max, comment ferait-on ?
    Merci pour l'aide.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je me suis appuyé la dessus qui semble présent depuis la version 2 uniquement. Quelle est la votre ?

    Sinon, vous pouvez essayer avec FIRST

    s'il y a un nombre indéfini de lignes réalisant le max, comment ferait-on ?
    C'est la question que j'allais vous poser !

    Si dans ce cas vous les voulez tous (les exæquo) vous pouvez partir sur une syntaxe plus conventionnelle, telle que celle que vous avez proposée dans votre deuxième post, qu'il est néanmoins possible de simplifier :

    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 
        D.nom AS name, 
        SUM(C.pop) AS total 
    FROM communes C 
    JOIN departements D
        ON C.dep = D.id
    GROUP BY D.nom
    HAVING SUM(C.pop) =(
        SELECT MAX(S)
        FROM (
            SELECT SUM(pop) AS S 
            FROM communes 
            GROUP BY dep
        ) AS T
    )

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ceci me convient parfaitement. Merci beaucoup. Je n'avais jamais utilisé la commande HAVING, et je me rends ici compte de son utilité !

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Bonjour ,
    Etant sur la route hier , je n'ai lu ce message qu'aujourd'hui

    il faudrait essayer (je n'ai pas de jeu d'essai)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT FIRST 1
        D.nom AS name, 
        SUM(C.pop) AS total 
    FROM communes C 
    JOIN departements D
        ON C.dep = D.id
    GROUP BY D.nom
    ORDER BY 2 DESC
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Texte sur une ligne 50 caractères max
    Par jameson dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/04/2014, 11h20
  2. Chargement de la ligne avec la max date
    Par gaxpery dans le forum QlikView
    Réponses: 7
    Dernier message: 23/01/2013, 14h07
  3. Réponses: 4
    Dernier message: 14/10/2011, 16h18
  4. Selectionner une ligne avec un max sur plusieurs critères
    Par achestyx dans le forum Développement
    Réponses: 2
    Dernier message: 31/03/2011, 10h53
  5. Réponses: 1
    Dernier message: 23/11/2007, 14h11

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