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

Oracle Discussion :

[Débutante]La fonction de groupe ne porte pas sur un groupe simple


Sujet :

Oracle

  1. #1
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut [Débutante]La fonction de groupe ne porte pas sur un groupe simple
    bonsoir à tous,
    je travaille sur la base echantillion se trouvant dans le compte scott.
    la requete est :Job ayant le salaire moyen le plus bas.
    j'ai fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select min(avg(sal)),job from emp group by job;
    et ca me retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERREUR à la ligne 1 :
    ORA-00937: La fonction de groupe ne porte pas sur un groupe simple
    j'ai besoin de comprendre pourquoi ca ne fonctionne pas.
    merci de m'expliquer

  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 163
    Points : 98
    Points
    98
    Par défaut
    Je pense que c'est ton min qui pose problème.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 163
    Points : 98
    Points
    98
    Par défaut
    Dommage j'ai pas la base installée

    mais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT job FROM emp 
    GROUP BY job
    having min(avg(sal))
    ne serait il pas mieux

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    que donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT sal_moy, job FROM
    (SELECT min(sal) sal_min, avg(sal) sal_moy,job 
    FROM emp 
    GROUP BY job)
    WHERE sal_moy = sal_min;
    Ou peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT avg(sal) sal_moy,job 
    FROM emp 
    HAVING min(sal) = avg(sal)
    GROUP BY job)

  5. #5
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    en effet le probleme vient du min comme a dit grome, mais
    non la requete proposé par grome ne fonctionne pas.
    en ce qui concerne les deux propositions de orafrance, ca donne le meme resultat, mais ca n'a rien a voir avec le resultat attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SAL_MOY JOB
    --------- ---------
         3000 ANALYST
         5000 PRESIDENT
    la solution c'été celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select job from emp group by  job having avg(sal)=(select min(avg(sal)) from emp group by job);
    et retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JOB
    ---------
    CLERK
    mais tjrs pas compris pourquoi ma premiere proposition ne fonctionne pas, y'a bien qqchose qui m'echappe

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Tu supprime sal_moy de mes requêtes et tu as le même résultat, tu peux même supprimer le groupe by

  7. #7
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    j'ai pas trop saisi
    je voulais dire que le resultat attendu c'été ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JOB
    ---------
    CLERK

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT job 
    FROM emp 
    HAVING min(sal) = avg(sal)
    suffit de supprimer le salaire des colonnes sélectionnées

  9. #9
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    je croyais que having est une fonction de groupe!
    et puis ca retourne le même message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> SELECT job 
      2  FROM emp 
      3  HAVING min(sal) = avg(sal);
    SELECT job
           *
    ERREUR à la ligne 1 :
    ORA-00937: La fonction de groupe ne porte pas sur un groupe simple

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    en effet

    le problème c'est que tu appliques 2 fonctions de groupes sur 2 groupes différents (min groupé sur avg qui lui est groupé par job) .

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par ranell Voir le message
    la solution c'été celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select job from emp group by  job having avg(sal)=(select min(avg(sal)) from emp group by job);
    et retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JOB
    ---------
    CLERK
    mais tjrs pas compris pourquoi ma premiere proposition ne fonctionne pas, y'a bien qqchose qui m'echappe
    Une autre solution possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with t as
    (
      select job, avg(sal) as avg_sal
      from emp
      group by job
    )
    select job
    from t
    where avg_sal = (select min(avg_sal) from t)
    Une autre façon encore:
    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 t as
    (
      select job, avg(sal) as avg_sal
      from emp
      group by job
    ),
    t1 as
    (
      select t.*, dense_rank()over(order by avg_sal) rn
      from t
    )
    select job
    from t1
    where rn = 1
    Consultant et formateur Oracle

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2010, 13h23
  2. Réponses: 2
    Dernier message: 08/09/2008, 10h50
  3. Réponses: 5
    Dernier message: 23/06/2008, 16h13
  4. fonction confirm() qui ne fonctionne pas sur IE7
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/06/2008, 09h47
  5. Réponses: 2
    Dernier message: 11/04/2006, 16h09

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