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 :

Select sur deux tables + fonction d'agregation


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 21
    Par défaut Select sur deux tables + fonction d'agregation
    Bonjour,

    Soit une table "animal" :
    (idAnimal, nom) = (1, "rhino"), (2, "chien")

    Soit une table 'repas" :
    (idRepas, idAnimal, Date, Quantite) = (1, 1, 5nov, 20k), (2, 1, 10nov, 17k), (3, 1, 13nov, 18k)

    J'aimerais avoir ce genre de résultat :
    (idAnimal, nom, date du dernier repas, quantité mangée lors du dernier repas)

    et

    (idAnimal, nom, quantité mangée au total)

    Je vois bien un MAX pour la première et un SUM pour la seconde mais je n'arrive pas mélanger les deux tables (INNER JOIN, WHERE) et ces fonctions d’agrégation.

    Merci pour votre aide,

    PurL

  2. #2
    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
    Par défaut
    Bonjour,

    Le dernier repas, c'est le premier par ordre décroissant de date :

    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
     
    ;WITH CTE AS (
        SELECT 
            a.idAnimal
            ,a.nom
            ,r.date --> notez que date est un mot reservé, changez le nom de la colonne
            ,r.Quantite
            ,ROW_NUMBER() OVER (PARTITION BY a.idAnimal ORDER BY r.date DESC) AS Rang
        FROM     Animal a
        INNER JOIN Repas r
            ON    r.idAnimal = a.idAnimal
    )
    SELECT idAnimal, nom, date, quantite
    FROM CTE
    WHERE Rang = 1
    et pour la seconde, en effet un SUM avec une simple jointure suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        SELECT a.IdAnimal, a.nom, SUM(r.quantite) AS QteTotale
        FROM     Animal a
        INNER JOIN Repas r
            ON    r.idAnimal = a.idAnimal
        GROUP BY  a.IdAnimal, a.nom

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 21
    Par défaut
    Merci pour cette réponse.
    Je ne suis pas encore très familiarisé avec GROUP BY.
    Par contre, j'ai oublié de préciser que je suis sous MySQL et que se SGBD ne semble pas supporter l'instruction WITH. Avez-vous une alternative ?

    Merci,

    PurL

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Le with, c'est une autre manière de définir une table dérivée.
    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
    SELECT  idAnimal
        ,   nom
        ,   date
        ,   quantite
    FROM    (   SELECT  a.idAnimal
                    ,   a.nom
                    ,   r.date --> notez que date est un mot reservé, changez le nom de la colonne
                    ,   r.Quantite
                    ,   ROW_NUMBER() OVER (PARTITION BY a.idAnimal ORDER BY r.date DESC) AS Rang
                FROM    Animal  a
                    INNER JOIN
                        Repas r
                        ON  r.idAnimal = a.idAnimal
            )   cte
    WHERE   Rang = 1
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    Par défaut
    en effet,

    mais je pense que MySQL va aussi raler sur la fonction fentrée ROW_NUMBER()
    Il faudra donc une autre autre requete.

    Un indice :
    Je disais
    Le dernier repas, c'est le premier par ordre décroissant de date :
    On peut aussi dire :
    Le dernier repas c'est celui pour lequel il n'en existe pas de plus récent.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 21
    Par défaut
    J'ai l'impression que ça marche ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT a.idAnimal
    , a.nom
    , s.date
    , s.quantite
    FROM 
    ( 
    SELECT r.idAnimal, MAX(r.Date) AS date, MAX(r.Quantite) AS quantite
    FROM Repas r
    ORDER BY r.idAnimal
    ) s
    INNER JOIN Animal a ON a.idAnimal = s.idAnimal
    Qu'en dites-vous ?

    (Désolé pour la présentation, mais je n'arrive pas à indenter le code)

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

Discussions similaires

  1. Requête "select" sur deux tables dont une vide
    Par Torgar dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/10/2009, 09h27
  2. Select sur deux tables, résultat formaté
    Par Warluck dans le forum PL/SQL
    Réponses: 2
    Dernier message: 04/12/2008, 19h45
  3. Requete mysql : select sur deux tables
    Par IP-Fix dans le forum Requêtes
    Réponses: 9
    Dernier message: 12/11/2008, 16h03
  4. SELECT sur deux tables
    Par Gaetch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/07/2007, 15h40
  5. Select sur deux tables
    Par DJuL- dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/03/2007, 14h40

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