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 :

GROUP BY - MAX - mais que le plus grand.


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut GROUP BY - MAX - mais que le plus grand.
    Bonjour.

    Désolé. Un truc sans doute très bête, mais je n'arrive pas à trouver.

    Désolé aussi pour le titre. J'ai du mal à résumer le problème.

    Une seule table (clé sur code-produit et code-fournisseur):
    table-commande (code-produit, code-fournisseur, qte-commandee, prix-produit)

    Pour chaque fournisseur, le prix le plus élevé en commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT code-fournisseur, Max(prix-produit) as [Prix le plus grand]
    FROM table-commande
    GROUP BY code-fournisseur;

    Plus difficile: même chose, mais avec le code du produit qui est le plus cher chez ce fournisseur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT code-fournisseur, code-produit, Max(prix-produit) as [Prix le plus grand]
    FROM table-commande
    GROUP BY code-fournisseur, code-produit;

    Hélas: j'obtiens alors, fournisseur par fournisseur, tous les produits en commande (et non plus le seul produit le plus cher).

    J'ai beau essayer de tenter d'autres pistes, je tourne en rond. Il doit y avoir une astuce (une façon de voir la requête), mais je reste bloqué sur ma façon d'envisager la requête.

    Je fouille aussi sur le net, mais tous les group by trouvés pour l'instant ne proposent que des requêtes qui ne m'aident pas à avancer.
    Je n'ai pas non plus réussi à trouver dans le forum. Désolé.

    Ce doit être très bête.

    Un grand merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Responsable Datas
    Inscrit en
    janvier 2009
    Messages
    4 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Datas

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 020
    Points : 9 356
    Points
    9 356
    Par défaut
    Bonjour,
    Ta demande revient en fait à une recherche du premier/dernier/plus grand/plus petit…
    Tu pourras trouver plusieurs méthodes ici.

    Tatayo.

  3. #3
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    YYYY
    Inscrit en
    mai 2002
    Messages
    19 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : YYYY
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 260
    Points : 45 556
    Points
    45 556
    Par défaut
    Vous ne pouvez pas avoir à la fois, le détail et l'agrégat. Le détail c'est plusieurs ligne, l'agrégat une seule. Il n'est donc pas faisable dans une seule requête d'avoir à la fois une ligne et plusieurs....
    Mais en décomposant,
    1) l'agrégat
    2) le détail en filtrant sur la VALEUR de l'agrégat
    Vous obtiendrez satisfaction

    1) calcul de l'agrégat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT "code-fournisseur", Max("prix-produit") as Prix_le_plus_grand
    FROM "table-commande"
    GROUP BY "code-fournisseur";
    2) le détail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM "table-commande"
    3) le tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT C.*
    FROM   "table-commande" AS C
           JOIN (SELECT "code-fournisseur", Max("prix-produit") as Prix_le_plus_grand
                 FROM   "table-commande"
                 GROUP  BY "code-fournisseur") AS P
              ON C."code-fournisseur" = P."code-fournisseur"
              AND C."prix-produit" = P.Prix_le_plus_grand
    AU PASSAGE : je remarque des caractères illicites (tiret) dans vos nom d'objet (colonnes notamment). Virez les et mettez une blanc souligné. Sinon, vous allez au devant de GRAVES ennuis !

    Apprenez le langage SQL... Mon livre, comme mon site web, peuvent vous y aider :
    Nom : SQL.jpg
Affichages : 37
Taille : 47,4 Ko

    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  4. #4
    Futur Membre du Club
    Inscrit en
    mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup SQLpro.

    Je ne connaissais pas du tout cette solution de création d'une table temporaire. On peut ensuite l'utiliser à volonté.

    Je note aussi votre remarque pour les "-" au lieu des "_".

    Encore merci pour tout.

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

Discussions similaires

  1. Réponses: 62
    Dernier message: 15/07/2019, 10h18
  2. Réponses: 3
    Dernier message: 04/07/2012, 14h33
  3. Ne récupérer que les plus grandes dates
    Par david71 dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 28/07/2010, 19h13
  4. Réponses: 2
    Dernier message: 18/03/2009, 08h48
  5. Ne garder que le plus grand
    Par mobscene dans le forum Langage
    Réponses: 30
    Dernier message: 23/12/2005, 02h23

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