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 :

Probleme avec Group by sous Oracle10g


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 ?

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut
    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 .

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    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.

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

Discussions similaires

  1. Problème avec ifconfig, ping... sous linux
    Par boubouc dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 12/02/2006, 16h15
  2. problem avec un select sous IE?
    Par Death83 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/12/2005, 14h36
  3. Probleme avec un float sous FF
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/11/2005, 18h15
  4. probleme avec requete et sous-requete...
    Par birkoss dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/08/2005, 21h26
  5. Problème avec mes emails sous postfix
    Par barbot dans le forum Réseau
    Réponses: 4
    Dernier message: 23/06/2004, 14h56

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