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 :

Besoin d'aide sur une requête avec un MAX()


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Besoin d'aide sur une requête avec un MAX()
    Bonjour,

    Je cherche à faire une requête SQL assez complexe, et je galère légèrement (bon je suis pas vraiment un expert en la matière faut dire).
    Le problème est le suivant:
    Comment faire un MAX() tout en récupérant d'autres informations de la table sur laquelle on le fait?

    Bon je vais prendre un exemple simple vu qu'il faudrait 3 jours pour expliquer notre schéma métier : j'ai 3 tables, Entreprise(id,nom), Secteur(id, nom), Employé(id,prénom,nom,salaire, entreprise_id, secteur_id)
    Je voudrais afficher le salaire maximum par secteur, pour chaque entreprise.
    Rien de très compliqué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT e.nom as e_nom, s.nom as s_nom, MAX(em.salaire) 
    from Entreprise e, Employe em, Secteur s 
    where em.entreprise_id=e.id and em.secteur_id=s.id 
    group by e_nom,s_nom
    Maintenant on va dire que je veux afficher le nom de l'employé ayant le salaire maximum en plus, et là je vois plus comment faire ! Si je fais la même requête en rajoutant em.nom dans le SELECT, il m'oblige à mettre le em.nom dans le group by et du coup la requête n'a plus aucun sens.
    Bon ça doit pas être compliqué à faire je pense, mais bon je ne connais pas la méthode, et bon vu que c'est assez spécifique comme problème j'ai pas réussi à trouver une solution sur le net.

    Bref si quelqu'un veut bien m'éclairer, je suis preneur =)
    Merci et @+

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Spécifique, mais assez commun.
    Regardez du coté des fonctions analytiques.
    Ca donne des choses du genre: max(em.salaire) over (partition by e.nom order by 1). Ce qui donnerait le em.salaire maximum pour chaque e.nom.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Quel SGBD ?
    Les solutions sont sous-requête (tous), fonctions analytiques (rank pour sqlserver, postgre ou oracle) ou first/last (oracle).

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Hmm pour le OVER déjà c'est mort, on se sert de Postgresql 8.3 et la clause OVER a été introduite dans la version 8.4 on dirait :/
    @skuatamad: T'aurais un exemple à me fournir avec une sous-requête? (sans que ça plombe trop les performances si possible ^^)

    Merci pour les réponses !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    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
    WITH T0 AS
    (
    SELECT e.id AS Ent_id, s.id AS Sct_id, em.id AS emp_id, MAX(em.salaire) AS SALAIRE_MAX
    FROM   Entreprise e
           INNER JOIN Employe em ON em.entreprise_id=e.id
           INNER JOIN Secteur s ON em.secteur_id=s.id 
    GROUP BY e.id, s.id, em.id
    )
    SELECT e.*, s.*, em.*
    FROM   Entreprise e
           INNER JOIN Employe em 
                 ON em.entreprise_id=e.id
           INNER JOIN Secteur s 
                 ON em.secteur_id=s.id 
           INNER JOIN T0 
                 ON  e.id = T0.Ent_id
                 AND s.id = T0.Sct_id
                 AND em.id = T0.emp_id
                 AND em.salaire = SALAIRE_MAX;
    Les jointures se font depuis plus de 20 ans avec JOIN / ON... Ou avez-vous appris le SQL ???


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Heu j'en ai fait un peu à la fac, en école d'ingé (mais bon ça remonte ^^), et au boulot mais bon c'est plutôt rare, et même si elles peuvent être complexes des fois, ça fait un moment que j'ai pas touché aux fonctions MAX(), AVG() etc, donc je suis un peu perdu !

    En tout cas merci pour la solution, je vais tester ça tout de suite.

Discussions similaires

  1. Besoin aide sur une requête avec jointure
    Par PoichOU dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/08/2010, 18h32
  2. besoin d'aide sur une requête mysql
    Par unmulot dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2006, 13h17
  3. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  5. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29

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