Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2007, 23h13   #1
Membre actif
 
Inscription : février 2007
Messages : 399
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 399
Points : 156
Points : 156
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 :
SELECT min(avg(sal)),job FROM emp GROUP BY job;
et ca me retourne:
Code :
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
ranell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 09h34   #2
Membre du Club
 
Inscription : mars 2005
Messages : 163
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 163
Points : 63
Points : 63
Je pense que c'est ton min qui pose problème.
grome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 09h39   #3
Membre du Club
 
Inscription : mars 2005
Messages : 163
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 163
Points : 63
Points : 63
Dommage j'ai pas la base installée

mais un

Code :
1
2
3
SELECT job FROM emp 
GROUP BY job
HAVING min(avg(sal))
ne serait il pas mieux
grome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 09h53   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
que donne ceci :
Code :
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 :
1
2
3
4
SELECT avg(sal) sal_moy,job 
FROM emp 
HAVING min(sal) = avg(sal)
GROUP BY job)
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h08   #5
Membre actif
 
Inscription : février 2007
Messages : 399
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 399
Points : 156
Points : 156
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 :
1
2
3
4
5
 
SAL_MOY JOB
--------- ---------
     3000 ANALYST
     5000 PRESIDENT
la solution c'été celle ci:
Code :
SELECT job FROM emp GROUP BY  job HAVING avg(sal)=(SELECT min(avg(sal)) FROM emp GROUP BY job);
et retourne
Code :
1
2
3
4
 
JOB
---------
CLERK
mais tjrs pas compris pourquoi ma premiere proposition ne fonctionne pas, y'a bien qqchose qui m'echappe
ranell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h10   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Tu supprime sal_moy de mes requêtes et tu as le même résultat, tu peux même supprimer le groupe by
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h43   #7
Membre actif
 
Inscription : février 2007
Messages : 399
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 399
Points : 156
Points : 156
j'ai pas trop saisi
je voulais dire que le resultat attendu c'été ca
Code :
1
2
3
4
 
JOB
---------
CLERK
ranell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h49   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
donc :
Code :
1
2
3
SELECT job 
FROM emp 
HAVING min(sal) = avg(sal)
suffit de supprimer le salaire des colonnes sélectionnées
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h52   #9
Membre actif
 
Inscription : février 2007
Messages : 399
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 399
Points : 156
Points : 156
je croyais que having est une fonction de groupe!
et puis ca retourne le même message d'erreur :
Code :
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
ranell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 17h55   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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) .
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2007, 23h20   #11
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par ranell Voir le message
la solution c'été celle ci:
Code :
SELECT job FROM emp GROUP BY  job HAVING avg(sal)=(SELECT min(avg(sal)) FROM emp GROUP BY job);
et retourne
Code :
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 :
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 :
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
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h56.


 
 
 
 
Partenaires

Hébergement Web