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
    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
    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

    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 :


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Futur Membre du Club
    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.

###raw>template_hook.ano_emploi###