Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 02/03/2011, 10h55   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Par défaut Probleme avec Group by sous Oracle10g

Bonjour,

Je galère depuis un bon moment sur une requête qui me renvoit à chaque fois l'erreur : n'est pas une expression de groupe. Je suis Oracle 10g.

J'ai essayé plusieurs solutions mais qui se sont avérées toutes infructueuses. Si quelqu'un peut m'aider ça serait avec grand plaisir.

Ma requête est la suivante (ORA-00979):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
count(RES."ID") AS "NbrRes",
RES.PATIENT_LASTNAME AS "lastname",
RES.PATIENT_MAIDEN_NAME AS "maiden name",
RES.PATIENT_FIRSTNAME AS "firstname",
RES.EXTERNAL_NUMBER AS "numero externe",
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1 AS "Age",
(SELECT BOX_FULLNAME FROM HCQ_STORAGE_CONTAINER WHERE BOX_ID=RES.STORAGE_BOX_ID) AS "Box",
count(RES."ID")*RES.QUANTITY AS "QtDispo",
(SELECT SHORT_NAME FROM PRIMARY_UNIT WHERE ID=RES.UNIT_ID) AS "Unit"
 
FROM
HCQ_RESOURCE RES
 
GROUP BY
RES.PATIENT_LASTNAME,
RES.PATIENT_MAIDEN_NAME,
RES.PATIENT_FIRSTNAME,
RES.EXTERNAL_NUMBER,
RES.QUANTITY,
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1
ORDER BY
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1
J'ai également essayer de faire ceci mais ça me renvoit une erreur identifier invalide:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT
count(RES."ID") AS "NbrRes",
RES.PATIENT_LASTNAME AS "lastname",
RES.PATIENT_MAIDEN_NAME AS "maiden name",
RES.PATIENT_FIRSTNAME AS "firstname",
RES.EXTERNAL_NUMBER AS "numero externe",
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1 AS "Age",
(SELECT BOX_FULLNAME FROM HCQ_STORAGE_CONTAINER WHERE BOX_ID=RES.STORAGE_BOX_ID) AS "Box",
count(RES."ID")*RES.QUANTITY AS "QtDispo",
(SELECT SHORT_NAME FROM PRIMARY_UNIT WHERE ID=RES.UNIT_ID) AS "Unit"
 
FROM
HCQ_RESOURCE RES
 
GROUP BY 
RES.PATIENT_LASTNAME,
RES.PATIENT_MAIDEN_NAME,
RES.PATIENT_FIRSTNAME, 
RES.EXTERNAL_NUMBER, 
RES.QUANTITY,
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1 ,
Age,
Box,
Unit
ORDER BY 6
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 11h50   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

Dans votre 1ere requête vous fait un group by mais oubliez de lui spécifier des colonnes de votre select qui ne sont soumis à aucun opérateur mathématique (avg, count, min, max, ..)
Du coup il ne sait pas quoi faire avec les colonnes Box, QtDispo, Unit.

Dans votre 2eme requête vous rajouter les alias de votre close select dans votre groupe by. Ceci ne peut pas marcher car les alias sont créé après l'execution de la clause group by.



Ceci étant dit je ne comprend pas l'utilité de mettre dans votre clause select des sous-requete qui m'ont tout l'air de pouvoir remonter un résultat correct en passant par des jointures.

Qu'essayez vous de faire avec cette requête ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 12h03   #3
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Bonjour Punkoff,

Merci pour les précisions. En fait, l'emplacement qui porte l'alias Box et l'unité qui porte l'alias Unit sont dans deux tables différentes.
Le but de ma requête est d'afficher des informations contenu dans la table HCQ_RESOURCE où je calcul l'age et la quantité disponible. Mais je voudrais afficher l'emplacement des ressources ainsi que leurs unités.

Si je pars de ma première requête, comment puis la modifier pour ne plus avoir cette erreur ?

Merci encore.
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 13h12   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Je penses qu'il faut revoir entièrement votre requête, et pas ce focaliser sur cette erreur.

Sinon pour répondre à cette question, il faudrai mettre dans votre group by l'ordre de la sous-requete (et non seulement les alias), mais je ne suis pas sur que ca marche je ne connais pas oracle.

Bref, je part du principe que vos table ont des relations de type 1-1, vu que vous n'avez rien spécifié :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
SELECT
count(RES."ID") AS "NbrRes",
RES.PATIENT_LASTNAME AS "lastname",
RES.PATIENT_MAIDEN_NAME AS "maiden name",
RES.PATIENT_FIRSTNAME AS "firstname",
RES.EXTERNAL_NUMBER AS "numero externe",
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1 AS "Age",
STO.BOX_FULLNAME AS "Box",
count(RES."ID")*RES.QUANTITY AS "QtDispo",
PUNI.SHORT_NAME AS "Unit"
 
FROM
HCQ_RESOURCE RES
INNER JOIN HCQ_STORAGE_CONTAINER STO ON STO.BOX_ID=RES.STORAGE_BOX_ID
INNER JOIN PRIMARY_UNIT PUNI ON PUNI.ID=RES.UNIT_ID
GROUP BY
RES.PATIENT_LASTNAME,
RES.PATIENT_MAIDEN_NAME,
RES.PATIENT_FIRSTNAME,
RES.EXTERNAL_NUMBER,
RES.QUANTITY,
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1,
STO.BOX_FULLNAME,
PUNI.SHORT_NAME
ORDER BY
TRUNC(MONTHS_BETWEEN(RES.SAMPLE_SAMPLING_DATE,RES.PATIENT_BIRTHDATE)/12)+1
changez les jointures internes en jointures externes si besoin
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/03/2011, 13h39   #5
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Merci Punkoff pour votre aide. Oui c'est bien une 1-1 entre mes tables.

J'ai testé la requête ça fonctionne. A l'avenir j'utiliserai plutôt l'ordre de la sous-requete et non pas les alias.

Encore merci pour l'aide .
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 14h21   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par Jarod51 Voir le message
A l'avenir j'utiliserai plutôt l'ordre de la sous-requete et non pas les alias.
Il n'y a pas de plutôt, vous n'avez pas le choix.
Au moment où le parser SQL lit le GROUP BY, il n'est pas encore passé dans le SELECT et ne connait donc pas les alias de colonnes que vous avez défini.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h00.


 
 
 
 
Partenaires

Hébergement Web