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

SQL Oracle Discussion :

JOIN et GROUP BY


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut JOIN et GROUP BY
    Bonjour

    Je débute sur Oracle et je suis tombé sur un os au boulot. Alors j'essaye de le résoudre chez moi sur la 10g XE et la base d'exemple et j'ai le même souci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT emp.department_id,  dep.department_name, SUM(salary) FROM employees emp
    JOIN departments dep
    ON dep.department_id=emp.department_id
    GROUP BY emp.department_id
    Me retourne ORA-00979: N'est pas une expression GROUP BY

    J'ai beau essayé d'autres types de jointure (LEFT OUTER) ou de grouper sur autre chose rien n'y fait. J'ai pourtant trouvé sur le net des groupage avec des jointures donc ça devrait fonctionner. Qu'est-ce qui va pas ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    soit vous faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT emp.department_id,  SUM(salary) 
    FROM employees emp
    JOIN departments dep
      ON dep.department_id=emp.department_id
    GROUP BY emp.department_id
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT emp.department_id,  dep.department_name, SUM(salary) 
    FROM employees emp
    JOIN departments dep
      ON dep.department_id=emp.department_id
    GROUP BY emp.department_id, dep.department_name

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Ce n'est pas le problème de la jointure mais le problème des champs que tu met dans le GroupBy.

    Dans le GROUP BY doit apparaitre tous les champs du SELECT qui ne sont pas dans une fonction d'agrégation (le groupement)

    Ici ta fonction d'agrégation est le SUM, tous les autres champs sont des champs simples, ils doivent donc apparaitre dans la clause GROUP BY

    Voila pour l'explication.
    Pour la solution voir la réponse de Jerome_Mlt
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Merci de vos réponses c'est très clair.

    L'ennui c'est qu'au boulot je vais avoir une dizaine d'autres champs à ramener de ce qui correspondrait à la table departments (qui contient donc un enregistrement unique pour chaque clé): ça va faire un GROUP BY long ça, et ça va donc faire bosser le moteur non ?
    Je me demande donc si ça serais pas mieux de faire une vue intermédiaire pour les sommes, puis de faire la jointure avec cette vue ? Ou une table temporaire ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Voilà je suis arrivè à cette solution là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT dep.department_id,  dep.department_name, emp.Total FROM departments dep
    JOIN (SELECT department_id, SUM(salary)Total 
          FROM employees GROUP BY department_id)emp
    ON dep.department_id=emp.department_id
    Vous en pensez quoi ?

  6. #6
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par Jeannot40 Voir le message
    Bonjour

    Je débute sur Oracle et je suis tombé sur un os au boulot. Alors j'essaye de le résoudre chez moi sur la 10g XE et la base d'exemple et j'ai le même souci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT emp.department_id,  dep.department_name, SUM(salary) FROM employees emp
    JOIN departments dep
    ON dep.department_id=emp.department_id
    GROUP BY emp.department_id
    Me retourne ORA-00979: N'est pas une expression GROUP BY

    J'ai beau essayé d'autres types de jointure (LEFT OUTER) ou de grouper sur autre chose rien n'y fait. J'ai pourtant trouvé sur le net des groupage avec des jointures donc ça devrait fonctionner. Qu'est-ce qui va pas ?

    Bonjour,


    En regardant votre reqûete il me semble que vous souhaitez que la valeur de SUM soit renvoyées pour tous les salariés de chaque département. Si c'est le cas, je pense qu'il vaut mieux passer par les fonctions analytique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT	emp.department_id,  
            dep.department_name, 
            SUM(salary) OVER (PARTITION BY emp.department_id)
     
    FROM emp JOIN departments dep 
           ON (dep.department_id=emp.department_id)


    Cordialement,
    Dariyoosh
    Cordialement,
    Dariyoosh

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Merci pour cette solution.
    J'ai du la remanier un petit peu (il manquais l'alias sur la table employees).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT	emp.department_id,  
            dep.department_name, 
            SUM(salary) OVER (PARTITION BY emp.department_id)
     
    FROM employees emp JOIN departments dep 
           ON (dep.department_id=emp.department_id)
    Je viens de voir ça sur le net : il semblerait que les fonctions analytiques (que je ne connaissais pas) soit ce qu'il faut pour résoudre le plus efficacement ce problème http://lalystar.developpez.com/fonctionsAnalytiques/ . Mieux que ma requête imbriquée du post au dessus.
    Merci de me les avoir indiquées.

  8. #8
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Je suis content que la solution vous convient. Le lien suivant, peut être utile pour mieux connaître les fonctions analytiques (parmi de nombreux tutorials disponibles sur le net)

    http://www.orafaq.com/node/55

    Ainsi, le chapitre des fonctions analytiques dans ce livre est très très bien expliqué.

    [ame="http://www.amazon.com/Oracle-Database-Osborne-ORACLE-Press/dp/0071498508/ref=sr_1_1?ie=UTF8&s=books&qid=1277242494&sr=1-1"]Amazon.com: Oracle Database 11g SQL (Osborne ORACLE Press Series)…@@AMEPARAM@@http://ecx.images-amazon.com/images/I/41E5YmTj%2B1L.@@AMEPARAM@@41E5YmTj%2B1L[/ame]


    Cordialement,
    Dariyoosh
    Cordialement,
    Dariyoosh

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

Discussions similaires

  1. Left Join et Group By récupérer dernières valeurs
    Par djboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2009, 09h32
  2. left outer join et group by
    Par pobrouwers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/11/2007, 13h58
  3. left join et group by
    Par eclesia dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/08/2007, 09h19
  4. [Requête] Colonne invalide avec JOIN et Group By
    Par LordTal dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/03/2007, 18h13
  5. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 18h03

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