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 :

ORA-00979: not a GROUP BY expression


Sujet :

Oracle

  1. #1
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut ORA-00979: not a GROUP BY expression
    Je suis en 8.1.7.4. J'ai une requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TRUNC (date_ent / 10000) ANNEE, 
               LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)  NB_TRUC
        FROM truc
    GROUP BY TRUNC (date_ent / 10000)
      HAVING COUNT (*) > 10
    ORDER BY TRUNC (date_ent / 10000);
    qui fonctionnait tres bien.

    Je ne sais pas si cela a un rapport mais comme je suis dans le flou , je vous donnes un maximun d'element.

    J'ai arrété l'instance. Changé le CHARACTERE SET de US7ASCII vers WE8ISO8859P1.

    J'ai aussi modifié les paramtres d'instance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cursor_sharing     = FORCE
    open_cursors       = 1024
    timed_statistics        = TRUE
    remote_dependencies_mode    = SIGNATURE
    optimizer_index_caching     = 90
    optimizer_index_caching     = 25
    Et maintenant cette requete me donne une erreur ORA-00979: not a GROUP BY expression. En faisant référence à TRUNC (date_ent / 10000) ANNEE

    Si je retire cette partie de la requete ca fonctionne. Une dernière info date_ent est une date stocké dans un NUMBER(8)


    Si vous avez des idées....

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est quoi ça ?

    LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)
    t'aurais pas des valeurs NULL ?

  3. #3
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)
    Ca c'est juste du formatage. C'est requete me servent à générer par spool sqlplus une page HTML.

    Je ne pense pas cela soit un problème de valeur puisque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT  
               LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)  NB_TRUC
        FROM truc
    GROUP BY TRUNC (date_ent / 10000)
      HAVING COUNT (*) > 10
    ORDER BY TRUNC (date_ent / 10000);
    fonctionne correctement mais peut etre que je n'ai pas tout compris

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Peut etre y a-t-il un problème de conversion implicite le TRUNC pouvant être appliqué à un nombre et à une date...

    Essaye de faire plutot TRUNC(date_ent/10000 , 0) pour voir...

  5. #5
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Merci,

    C'est un site distant, je ne peux pas tester tout de suite. Je le ferais demain en attendant je ne comprends pas parce que TRUNC (date_ent / 10000) est ecrit de manière identique entre le SELECT et le GROUP BY. Si il y a des conversions implicites elles devraient etre identiques. Non ?

    Et aussi pcq j'ai testé la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT date_ent / 10000 ANNEE, 
               LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)  NB_TRUC
        FROM truc
    GROUP BY date_ent / 10000
      HAVING COUNT (*) > 10
    ORDER BY date_ent / 10000;
    par contre sans la division ca fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT date_ent ANNEE, 
               LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)  NB_TRUC
        FROM truc
    GROUP BY date_ent 
      HAVING COUNT (*) > 10
    ORDER BY date_ent;

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Je pensais que peut etre oracle pouvait tomber sur un null en début de select qui lui faisait basculer la fonction TRUNC en mode "DATE"... mais ton dernier exemple me rend pessimiste sur cette hypothèse... On dirait plutot que le soucis viens du passage par le type réel (engendré par la division)

    Par contre, je crois que tu peux contourner le problème en faisant autrement.
    Remplace "TRUNC (date_ent / 10000)" par "TRUNC (date_ent, -4) /10000" dans ton select, et il me semble que tu pourras faire à ce moment là un group by "TRUNC (date_ent, -4) " simplement.

  7. #7
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut


    J'ai finalement pas resisté a tester tout de suite tes propositions et..... non. Ni l'une ni l'autre ne passe

    J'ai fais en plus le test avec TRUNC(date_env) qui lui passe mais bien sur ne fait pas ce que je veux fonctionnellement ! ! !

    Encore merci de votre aide

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Et en faisant simplement un TRUNC (date_ent, -4) juste pour tester ?

    Sinon tu peux tenter de faire très laid en passant par un substr :

    substr (date_ent,1,length(date_ent) - 4)

    (j'ai limite honte de proposer des solution pareilles... )

  9. #9
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    salut !

    La requete est correcte, essaie le code ci-dessous dans toad, il va donner le resultat que tu souhaites:

    SELECT TRUNC(:dt_ent/10000 ) ANNEE,
    LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15) NB_TRUC
    FROM dual
    GROUP BY TRUNC(:dt_ent /10000)
    HAVING COUNT (*) > 0
    ORDER BY TRUNC(:dt_ent/10000 )

  10. #10
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    remi4444 J'ai essayé toutes tes idées et cela ne marche pas.... Dommage. J'ai toujours ce message idiot ! !

    salim11 Oui ton test avec DUAL fonctionne mais par contre cela ne donne pas du tout le résultat que je souhaite. Puisque je n'ai plus les information s de ma table.

    Bon, je crois que si je trouves un peut de temps je vais poster ça au support Oracle mais comme c'est une 8.1.7.4 il ne sont pas toujours très réactif

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut a tout hasard
    tu devrais essayer de mettre le paramètre cursor_sharing à EXACT, on sais jamais qu'oracle se mette la zone tout seul en réécrivant la requête...

  12. #12
    Membre régulier
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    A la lecture de vos tests, une idée me vient pour éviter la division dans le ORDER BY...

    As-tu essayer cette syntaxe ? (Désolé je n'ai pas pris le temps de tester : je n'ai qu'une base 9i sous la main)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TRUNC (date_ent / 10000) ANNEE, 
               LPAD(TO_CHAR(COUNT (*) , '9G999G999G999'),15)  NB_TRUC
    FROM truc
    GROUP BY TRUNC (date_ent / 10000)
    HAVING COUNT (*) > 10
    ORDER BY 1
    C'est vrai que la situation semble bizarre...

  13. #13
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Désolé c'est un site distant, je n'ai pas pu retester avant....

    Citation Envoyé par cquilgars
    Bonjour,
    A la lecture de vos tests, une idée me vient pour éviter la division dans le ORDER BY...


    Je ne comprends toujours pas pourquoi puisque cette requete fonctionnait avant et qu'elle fonctionne toujours sur d'autres bases avec la division. Mais c'est bien ca la solution :

    Remplacer le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY TRUNC (date_ent / 10000);
    par
    Il faut quand meme avouer que le message d'erreur n'est pas tres explicite.

    En tout cas un grand à tous

  14. #14
    Membre régulier
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Points : 86
    Points
    86
    Par défaut
    Toujours heureux de donner un coup de main à la communauté (qui me le rend bien d'ailleurs )

    J'ai simplement triché avec le bug. Cette syntaxe a l'avantage de s'assurer que le ORDER BY sera basé sur les valeurs restituées dans le SELECT sans expliciter la formule éventuelle (Elle est aussi faite pour les faineants )
    Attention, un tel ORDER BY est souvent plus couteux : Un ORDER BY sur une formule exploitant une colonne indexée ne sera pas aussi rapide que l'ORDER BY sur la colonne uniquement... Il faut préférer la 2ème solution... Surtout, si cela donne le même résultat !!! en terme de résultat d'ordonnancement (j'entends...)

    Je parle de bug car je suis entièrement d'accord : la situation n'est pas normale.

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

Discussions similaires

  1. ORA-00979: not a GROUP BY expression
    Par Oratorio dans le forum Oracle
    Réponses: 6
    Dernier message: 16/11/2012, 09h21
  2. ORA-00979:not a GROUP BY expression
    Par kodo dans le forum SQL
    Réponses: 2
    Dernier message: 16/12/2010, 18h11
  3. ORA-00979: N'est pas une expression GROUP BY
    Par chakibtag dans le forum SQL
    Réponses: 2
    Dernier message: 09/07/2008, 10h22
  4. ORA-00979: N'est pas une expression GROUP BY
    Par NiGHtyWolf dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2007, 19h11
  5. Erreur ORA-00979 : not a GROUP BY expression sur Oracle9i
    Par Dirty Henry dans le forum Oracle
    Réponses: 9
    Dernier message: 21/10/2005, 14h23

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