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 :

Jointure avec groupement


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut Jointure avec groupement
    Bonjour,

    J'ai du mal à faire une requête de groupement entre plusieurs tables. Je vous simplifie donc ici mon problème à l'extrême pour se concentrer sur le coeur de ce que je n'arrive pas à faire.

    Imaginons que j'ai une table client et une table commande.

    Table Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-------------+----------------+
    | ClientID    | Nom            |
    +-------------+----------------+
    | 01          | Martin         |
    | 02          | Bertrand       |
    +-------------+----------------+
    Table Commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +------------+-----------------+--------------+
    | CommandeID | DateCommande    | CmdClientID  |
    +------------+-----------------+--------------+
    | 01         | 2 janvier 2020  | 01           |
    | 02         | 15 décembre 2019| 02           |
    | 03         | 20 décembre 2019| 01           |
    | 04         | 12 janvier 2020 | 02           |
    +------------+-----------------+--------------+
    Comme vous l'aurez peut-être remarqué, j'ai volontairement mis des dates de commandes croissantes pour l'un et décroissantes pour l'autre. Bien entendu, les ID des tables sont toujours croissants, eux.


    Je souhaite obtenir les détails de la dernière commande passée par chaque client, donc les données suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-------------+----------------+------------+-----------------+--------------+
    | ClientID    | Nom            | CommandeID | DateCommande    | CmdClientID  |
    +-------------+----------------+------------+-----------------+--------------+
    | 01          | Martin         | 01         | 2 janvier 2020  | 01           |
    | 02          | Bertrand       | 04         | 12 janvier 2020 | 02           |
    +-------------+----------------+------------+-----------------+--------------+
    Je n'ai jamais vraiment bien compris les groupements en SQL. J'imagine que ça ne doit pas être très compliqué mais je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
        ClientID
        , Nom
        , CommandeID
        , DateCommande
        , CmdClientID
    FROM
        Client
        INNER JOIN Commandes ON CmdClientID = ClientID
    GROUP BY
        ClientID
    En écrivant ça, SQL me dit que je doit mettre des fonctions d'agregat dans les champs que je sélectionne mais je ne sais pas quoi mettre. Sur la date de la commande, je mettrai bien "MAX" mais pour les autres champs de la table commande, je ne vois pas.

    Sauriez-vous m'aider svp ?

    Merci.
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par jbat Voir le message
    ...Sur la date de la commande, je mettrai bien "MAX" mais pour les autres champs de la table commande, je ne vois pas.
    C'est justement là le point clef du problème… Tu ne peut pas avoir à la fois le détail et l'agrégat. Tu dois passer par une sous requête corrélée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECTFROM   … TABLE_FACTURE AS F
    WHERE  LaDateDeLaFacture = (SELECT MAX(LaDateDeLaFacture )
                                FROM   TABLE_FACTURE AS F2
                                WHERE F.ID_du_client = F2.ID_du_CLIENT) --> corrélation entre la requête principale et la sous requête…
    Relisez mon cours…
    https://sqlpro.developpez.com/cours/...usrequetes/#L2

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

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    Merci beaucoup.

    A force de tâtonnement, j'en était arrivé à cette conclusion de mon coté également. Mais il est toujours bon d'avoir confirmation d'une solution trouvé avec autant d'hésitations. Une (re)lecture de votre cours s'impose en effet. Merci beaucoup pour l'aide et le lien
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

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

Discussions similaires

  1. jointure avec 2 id différent pour 1 seul table.
    Par vermo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 10/11/2005, 15h19
  2. jointure avec clé composée de 2 colonnes
    Par free07 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/10/2005, 07h07
  3. Réponses: 2
    Dernier message: 27/10/2005, 11h15
  4. jointure avec xslt
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/09/2005, 10h48
  5. [SAGE]Jointures avec SGBD
    Par mat.M dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 09/10/2003, 12h23

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