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

SQL Oracle Discussion :

SQL Error [934] [42000]: ORA-00934: fonction de groupe non autorisée ici


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut SQL Error [934] [42000]: ORA-00934: fonction de groupe non autorisée ici
    Bonjour,

    J'avais effectuer un premier bout de code SQL afin de récupérer :


    La liste des noms d'organisation commence par HRE- et comportant juste 1 lettre après le tiret (comme HRE-A et non HRE-AB )

    Combien de personnes travaille pour chaque organisation

    La somme des personnes qui travaillent dans les différentes organisation

    Pour chaque organisation indiquait les catégories qui sont prise ( ex : Manpower Assig., National Space Agency, Permanent, ...)

    Voici mon 1er code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT SUBSTR(WFORGUNIT_CODE, 0, 5), 
    COUNT(WFORGUNIT_ID), 
    SUM(COUNT(WFORGUNIT_ID)) OVER(),
    LISTAGG(DISTINCT WFCAT_DESC, '--')
    FROM WFORGUNITS 
    INNER JOIN WFPOSITIONS ON WFORGUNITS.ID = WFPOSITIONS.WFORGUNIT_ID
    INNER JOIN WFRPERASS ON WFPOSITIONS.ID = WFRPERASS.WFPOSITION_ID 
    INNER JOIN WFCATS ON WFPOSITIONS.WFCAT_ID = WFCATS.ID
    WHERE SUBSTR(WFORGUNIT_CODE, 0, 4) = 'HRE-' AND WFRPERASS.WFRPERASS_ENDT >= SYSDATE AND WFRPERASS.WFRPERASS_STDT <= SYSDATE
    GROUP BY SUBSTR(WFORGUNIT_CODE, 0, 5)
    Cela donne :

    HRE-C 7 269 Manpower Assig.--National Space Agency--Permanent
    HRE-M 37 269 Manpower Assig.--Permanent--Service Contractor
    HRE-O 59 269 Consultant--Manpower Assig.--National Space Agency--Permanent--Service Contractor--Young Grad. Trainees
    HRE-P 69 269 Int. Research Fellow--Manpower Assig.--Permanent--Service Contractor
    HRE-Q 6 269 Permanent
    HRE-R 42 269 Manpower Assig.--Permanent--Service Contractor
    HRE-S 16 269 Int. Research Fellow--Manpower Assig.--Permanent--Service Contractor
    HRE-X 33 269 Manpower Assig.--Permanent--Young Grad. Trainees

    Maintenant j'aimerai rajouter une autre colonne qui indique combien il y aurai de personnes dans chaque catégories ( les Manpower Assig., National Space Agency, ... )

    J'ai donc repris le même code sql et rajouter 2 lignes (en rouge) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT SUBSTR(WFORGUNIT_CODE, 0, 5), 
    COUNT(WFORGUNIT_ID), 
    SUM(COUNT(WFORGUNIT_ID)) OVER(),
    LISTAGG(DISTINCT WFCAT_DESC, '--'),
    LISTAGG(COUNT(WFORGUNIT_ID), '--')
    FROM WFORGUNITS 
    INNER JOIN WFPOSITIONS ON WFORGUNITS.ID = WFPOSITIONS.WFORGUNIT_ID
    INNER JOIN WFRPERASS ON WFPOSITIONS.ID = WFRPERASS.WFPOSITION_ID 
    INNER JOIN WFCATS ON WFPOSITIONS.WFCAT_ID = WFCATS.ID
    WHERE SUBSTR(WFORGUNIT_CODE, 0, 4) = 'HRE-' AND WFRPERASS.WFRPERASS_ENDT >= SYSDATE AND WFRPERASS.WFRPERASS_STDT <= SYSDATE
    GROUP BY SUBSTR(WFORGUNIT_CODE, 0, 5), LISTAGG(DISTINCT WFCAT_DESC, '--')
    L'erreur que cela génère : SQL Error [934] [42000]: ORA-00934: fonction de groupe non autorisée ici

    En me renseignant un peu j'ai penser que je devais utiliser un HAVING mais cela me procure une autre erreur : SQL Error [920] [42000]: ORA-00920: opérateur relationnel non valide

    En espérant avoir été plus ou moins clair, j'aurais aimer savoir si quelqu'un aurait une piste de réflexion ou quelque chose comme


    Merci Bien

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 132
    Par défaut
    Bonjour,

    LISTAGG étant une fonction de regroupement, elle ne peut pas être utilisée dans la clause GROUP BY.

    Par ailleurs, l'expression SUM(COUNT(WFORGUNIT_ID)) OVER() à la ligne 4 pourrait utilement être remplacée par COUNT(WFORGUNIT_ID) OVER().
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Bonjour,

    LISTAGG étant une fonction de regroupement, elle ne peut pas être utilisée dans la clause GROUP BY.
    En effet c'est ce que je me disais. Je m'était donc dis de tout simplement laisser mon group by comme il était de base dans le mon premier code et ainsi le changement serait juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT SUBSTR(WFORGUNIT_CODE, 0, 5), 
    COUNT(WFORGUNIT_ID), 
    SUM(COUNT(WFORGUNIT_ID)) OVER(),
    LISTAGG(DISTINCT WFCAT_DESC, '--'),
    LISTAGG(COUNT(WFORGUNIT_ID), '--')
    FROM WFORGUNITS 
    INNER JOIN WFPOSITIONS ON WFORGUNITS.ID = WFPOSITIONS.WFORGUNIT_ID
    INNER JOIN WFRPERASS ON WFPOSITIONS.ID = WFRPERASS.WFPOSITION_ID 
    INNER JOIN WFCATS ON WFPOSITIONS.WFCAT_ID = WFCATS.ID
    WHERE SUBSTR(WFORGUNIT_CODE, 0, 4) = 'HRE-' AND WFRPERASS.WFRPERASS_ENDT >= SYSDATE AND WFRPERASS.WFRPERASS_STDT <= SYSDATE
    GROUP BY SUBSTR(WFORGUNIT_CODE, 0, 5);
    Cependant : SQL Error [979] [42000]: ORA-00979: n'est pas une expression GROUP BY

    En tout cas je vois mieux la raison de mon problème merci bien

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 132
    Par défaut
    Et comme ça ?

    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
    WITH    srq
        AS  (   SELECT  SUBSTR(WFORGUNIT_CODE, 0, 5)            AS  WFORGUNIT_PREFX
                    ,   COUNT(WFORGUNIT_ID)                     AS  WFORGUNIT_COUNT
                    ,   LISTAGG(DISTINCT WFCAT_DESC, '--')      AS  WFCAT_LIST
                FROM    WFORGUNITS 
                    INNER JOIN 
                        WFPOSITIONS
                        ON  WFORGUNITS.ID = WFPOSITIONS.WFORGUNIT_ID
                    INNER JOIN 
                        WFRPERASS 
                        ON  WFPOSITIONS.ID = WFRPERASS.WFPOSITION_ID 
                    INNER JOIN 
                        WFCATS 
                        ON  WFPOSITIONS.WFCAT_ID = WFCATS.ID
                WHERE   SUBSTR(WFORGUNIT_CODE, 0, 4) = 'HRE-' 
                    AND SYSDATE BETWEEN WFRPERASS.WFRPERASS_ENDT AND WFRPERASS.WFRPERASS_STDT
                GROUP BY SUBSTR(WFORGUNIT_CODE, 0, 5);
            )
    SELECT  WFORGUNIT_PREFX
        ,   WFORGUNIT_COUNT
        ,   SUM(WFORGUNIT_COUNT) OVER()
        ,   WFCAT_LIST
        ,   LISTAGG(WFORGUNIT_COUNT, '--')
    FROM    srq
    GROUP BY WFORGUNIT_PREFX
        ,   WFORGUNIT_COUNT
        ,   WFCAT_LIST
    Quoique je ne comprenne pas vraiment le besoin fonctionnel derrière LISTAGG(COUNT(WFORGUNIT_ID), '--')
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Citation Envoyé par al1_24 Voir le message

    Quoique je ne comprenne pas vraiment le besoin fonctionnel derrière LISTAGG(COUNT(WFORGUNIT_ID), '--')
    Chaque catégorie ( ex : Manpower Assig., National Space Agency, Permanent, ...) peuvent avoir plusieurs personnes associé dessus, je voulais savoir combien de personnes été associé a chaque catégorie


    En tout cas le code que tu m'as proposé supprime mon erreur c'est top. Cependant maintenant mon tableau est vide ^^

    Mais maintenant je possède tout les outils que j'avais besoin


    Merci bien

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2015, 10h27
  2. Encore et toujours: odbc_connect() [function.odbc-connect]: SQL error: [Oracle][ODBC][Ora]ORA-12705
    Par dufeu.celine dans le forum Connexions aux bases de données
    Réponses: 7
    Dernier message: 27/07/2011, 23h36
  3. Réponses: 12
    Dernier message: 06/08/2009, 16h16
  4. DBLINK ORACLE vers MYSQL SQL Error: ORA-2850
    Par chemical_seb dans le forum Connexions aux bases de données
    Réponses: 0
    Dernier message: 19/08/2008, 15h02
  5. PB Designer Fonction de group non autorisé !
    Par atb dans le forum Designer
    Réponses: 2
    Dernier message: 21/03/2008, 23h34

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